使用rsvp.js或任何其他的承诺/ A +实现我怎么能把这样的代码......如何嵌套一个定时器,转换为承诺
console.log('step 1');
setTimeout(function() {
console.log('step 2');
setTimeout(function() {
console.log('step 3');
}, 100);
}, 300);
为承诺实施?
使用rsvp.js或任何其他的承诺/ A +实现我怎么能把这样的代码......如何嵌套一个定时器,转换为承诺
console.log('step 1');
setTimeout(function() {
console.log('step 2');
setTimeout(function() {
console.log('step 3');
}, 100);
}, 300);
为承诺实施?
创建一个延迟函数,它返回一个Promise,它在setTimeout
中经过指定的时间后,实际上解析它,就像thi小号
function delay(time) {
return new RSVP.Promise(function (resolve) {
setTimeout(resolve, time);
});
}
,然后你可以调用它像这样
console.log("step 1");
delay(3000)
.then(function() {
console.log("step 2");
return delay(1000);
})
.then(function() {
console.log("step 3");
});
链的承诺:
// Set up the functions which contain the promises
function step1() {
return new RSVP.Promise(function(resolve, reject) {
resolve();
});
}
function step2() {
return new RSVP.Promise(function(resolve, reject) {
setTimeout(function() {
resolve();
}, 300);
});
}
function step3() {
return new RSVP.Promise(function(resolve, reject) {
setTimeout(function() {
resolve();
}, 100);
});
}
// Now execute them:
step1()
.then(step2)
.then(step3)
你可以在这里阅读更多:如果你没事使用qhttp://www.toptal.com/javascript/javascript-promises
,还有烤成库一个非常简单的解决方案:
console.log('step 1');
Q.delay(300).then(function() {
console.log('step 2');
return Q.delay(200);
}).then(function() {
console.log('step 3');
});
按照rules of thumb for promise development!首先,我们需要promisify调用setTimeout
,以便我们得到一个函数,它返回给我们一个承诺。随着the RSVP Promise
constructor,它应该是这样的:
function delay(time) {
return new RSVP.Promise(function(resolve) {
setTimeout(resolve, time);
});
}
现在,我们可以使用then
而不是通过回调右转入setTimeout
chain日志声明:
console.log("step 1");
delay(3000).then(function() {
console.log("step 2");
return delay(1000).then(function() {
console.log("step 3");
});
});
...和你回来的承诺当所有三个步骤都执行完毕。
但是,then
的实际功能是您现在可以unnest the callbacks,并得到完全相同的结果。所以你的连锁店看起来是这样的:
console.log("step 1");
delay(3000).then(function() {
console.log("step 2");
return delay(1000);
}).then(function() {
console.log("step 3");
});