Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 蓝知更鸟是如何知道在这条链中进入下一个“then”的?_Javascript_Node.js_Promise_Bluebird_Chaining - Fatal编程技术网

Javascript 蓝知更鸟是如何知道在这条链中进入下一个“then”的?

Javascript 蓝知更鸟是如何知道在这条链中进入下一个“then”的?,javascript,node.js,promise,bluebird,chaining,Javascript,Node.js,Promise,Bluebird,Chaining,在获得fs extra许可后,我了解我可以使用然后访问文件。我想有一种机制,在它得到文件后,它知道移动到然后链中的下一个链接。然而,下一个然后我刚刚放了一个简单的for循环。下一个只是打印一行到控制台。我希望返回某种类型的Promise对象,以便它沿着链向下移动。沿着这条链条往下走需要什么?例如,如果我输入setTimeout一秒钟,则链将继续并按顺序打印 var Promise = require('bluebird') , fs = Promise.promisifyAll(requir

在获得fs extra许可后,我了解我可以使用
然后
访问文件。我想有一种机制,在它得到文件后,它知道移动到
然后
链中的下一个链接。然而,下一个
然后
我刚刚放了一个简单的for循环。下一个只是打印一行到控制台。我希望返回某种类型的Promise对象,以便它沿着链向下移动。沿着这条链条往下走需要什么?例如,如果我输入setTimeout一秒钟,则链将继续并按顺序打印

var Promise = require('bluebird')
  , fs = Promise.promisifyAll(require('fs-extra'))

fs.readdirAsync(dir)
    .bind(this)
    .then((files) => {
        this.files = files;
    })
    .then(() => {
        var num = 10000
        this.files.forEach((file, index, array) => {
            for(i = 0; i < num; i++){
                console.log(num*i);
            }
        });
    })
    .then(() => {
        console.log('middle of it');
    })
    .then(() => {
        console.log('done with it');
    })
    .catch((err) => {
        console.log(err);
    });
var Promise=require('bluebird'))
,fs=Promise.promisifyAll(require('fs-extra'))
fs.readdirAsync(dir)
.绑定(此)
。然后((文件)=>{
this.files=文件;
})
.然后(()=>{
var num=10000
this.files.forEach((文件、索引、数组)=>{
对于(i=0;i{
console.log('middle of it');
})
.然后(()=>{
log('done with it');
})
.catch((错误)=>{
控制台日志(err);
});
.then()
的每次调用都返回一个新的承诺,该承诺有自己的
.then()
处理程序。该承诺会自动链接到上一个承诺,因此,当上一个承诺完全使用自己的
完成时,那么()
处理程序和该
处理程序。那么()
处理程序没有返回承诺,或者当它返回的承诺得到解决时,如果它返回了承诺,然后,它可以触发要解析的链中的下一个承诺,从而使其对
.then()
处理程序重复该循环

关键是
p.then()
返回一个新的承诺,当
p.then()
完成时,该承诺会自行解决,这样它就可以触发链中的下一步
p.then().then()
等等

请记住,
.then()
处理程序可以执行以下四项操作之一:

  • 不返回任何内容(与返回未定义的
    相同)
  • 返回一个值
  • 还愿
  • 抛出异常
  • 对于前两个(返回值),这只表示
    .then()
    处理程序已完成,然后可以触发链中的下一个处理程序

    返回承诺时,该承诺本身与
    .then()
    处理程序挂钩,以便对其进行监视。如果/当其解析时,链将继续。如果/当其拒绝时,链将被拒绝。被退回的承诺可能已经被解决或拒绝,也可能在将来被解决或拒绝,行为上没有任何有意义的差异。如果返回的承诺从未得到解决或拒绝,则承诺链将暂停,并且在得到解决或拒绝之前不会继续(与任何承诺相同)

    如果
    .then()
    处理程序抛出异常,则该异常会被
    .then()
    包装器捕获,并自动转换为拒绝的承诺,将异常作为拒绝原因

    例如,如果我输入setTimeout一秒钟,那么 继续并按顺序打印

    您无法单独有效地使用
    setTimeout()
    来延迟承诺链。相反,您需要从一个
    .then()
    处理程序返回一个承诺,该承诺在一段超时时间后解析。蓝鸟有
    .delay(x)
    可以帮你做到这一点

    或者,如果不使用Bluebird,您可以自己编写一个代码:

    function delay(t) {
        return new Promise(function(resolve) {
            setTimeout(resolve, t);
        });
    }
    
    fn().then(function() {
        // delay promise chain by 1000ms
        return delay(1000);
    }).then(function() {
        // promise chain continues here
    });
    
    或者,有了蓝知更鸟的承诺,就简单到:

     fn().delay(1000).then(function() {
         delayed promise chain continues here
     });
    
    每次调用
    .then()
    都会返回一个新的承诺,该承诺有自己的
    .then()
    处理程序。该承诺会自动链接到上一个承诺,因此,当上一个承诺完全使用自己的
    完成时,那么()
    处理程序和该
    处理程序。那么()
    处理程序没有返回承诺,或者当它返回的承诺得到解决时,如果它返回了承诺,然后,它可以触发要解析的链中的下一个承诺,从而使其对
    .then()
    处理程序重复该循环

    关键是
    p.then()
    返回一个新的承诺,当
    p.then()
    完成时,该承诺会自行解决,这样它就可以触发链中的下一步
    p.then().then()
    等等

    请记住,
    .then()
    处理程序可以执行以下四项操作之一:

  • 不返回任何内容(与返回未定义的
    相同)
  • 返回一个值
  • 还愿
  • 抛出异常
  • 对于前两个(返回值),这只表示
    .then()
    处理程序已完成,然后可以触发链中的下一个处理程序

    返回承诺时,该承诺本身与
    .then()
    处理程序挂钩,以便对其进行监视。如果/当其解析时,链将继续。如果/当其拒绝时,链将被拒绝。被退回的承诺可能已经被解决或拒绝,也可能在将来被解决或拒绝,行为上没有任何有意义的差异。如果返回的承诺从未得到解决或拒绝,则承诺链将暂停,并且在得到解决或拒绝之前不会继续(与任何承诺相同)

    如果
    .then()
    处理程序抛出异常,则该异常会被
    .then()
    包装器捕获,并自动转换为拒绝的承诺,将异常作为拒绝原因

    例如,如果我输入setTimeout一秒钟,那么 继续并按顺序打印

    您无法单独有效地使用
    setTimeout()
    来延迟承诺链。相反,您需要从一个
    .then()
    处理程序返回一个承诺,该承诺在一段超时时间后解析。蓝鸟有
    .delay(x)
    可以帮你做到这一点

    或者,如果不使用Bluebird,您可以自己编写一个代码:

    function delay(t) {
        return new Promise(function(resolve) {
            setTimeout(resolve, t);
        });
    }
    
    fn().then(function() {
        // delay promise chain by 1000ms
        return delay(1000);
    }).then(function() {
        // promise chain continues here
    });
    
    或者,有了蓝知更鸟的承诺,就简单到:

     fn().delay(1000).then(function() {
         delayed promise chain continues here
     });
    

    这和做类似的事情是一样的