【发布时间】:2016-12-10 23:05:04
【问题描述】:
感谢this awesome video playlist,我以为我终于掌握了一些基本的 javascript 概念:回调、范围和上下文不再是难题。
然后,我决定使用 Promise(Node.js 中的 bluebird)......这些问题再次出现,我想我不明白范围和上下文如何与 Promise 一起工作。这是我运行的测试:
function testit(){
for (var i=0 ; i<3 ; i++) {
var test = i;
console.log(test);
Promise
.delay(5000) // do some async operations...
.then( () => {
console.log(test);
});
}
return("finished");
}
console.log(testit());
//// What I hoped to see :
// 0, 1, 2, finished, 0, 1, 2
//// What happens :
// 0, 1, 2, finished, 2, 2, 2
我在这里,回到范围/上下文问题。为了解决这个问题,我找到了 bluebird Promise.bind(),它给了我:
function testit(){
for (var i=0 ; i<3 ; i++) {
var test = i;
console.log(test);
Promise
.bind(this, test)
.delay(5000)
.then( (test) => {
console.log(test);
});
}
return("finished");
}
console.log(testit());
//// What happens :
// 0, 1, 2, finished, 0, 1, 2
耶!我有一个解决方法!但是在链接.next() 方法时显然不是很方便:我必须将test 的值从一个承诺传递给另一个承诺......在我的代码中不能这样做,我在其中链接了许多不同的函数/方法.
那么,在 Node.js 中使用 Promise 时,是否有一种更简洁的方法来“绑定”/“保留一些值”来自 for 循环?
编辑:我正在考虑关闭循环内的承诺链:
function testit(){
for (var i=0 ; i<3 ; i++) {
var test = i;
console.log(test);
(function (test){
Promise
.delay(5000) // do some async operations...
.then( () => {
console.log(test);
});
})(test);
}
return("finished");
}
console.log(testit());
//// What happens :
// 0, 1, 2, finished, 0, 1, 2
它也可以,这是我迄今为止最好的代码。但我最初的问题仍然存在:是否有更好/更清洁的方法来实现最初预期的结果?
结论:接受的答案可能是管理循环内异步操作的最干净的方法。使用在循环之外声明的闭包函数。谢谢 Rob M.!
【问题讨论】:
标签: javascript node.js promise bluebird