Javascript 蓝知更鸟是如何知道在这条链中进入下一个“then”的?
在获得fs extra许可后,我了解我可以使用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
然后
访问文件。我想有一种机制,在它得到文件后,它知道移动到然后链中的下一个链接。然而,下一个然后
我刚刚放了一个简单的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
});
这和做类似的事情是一样的