如何将嵌套的setTimeouts转换为promises

时间:2015-04-01 16:30:00

标签: javascript promise rsvp.js rsvp-promise

使用rsvp.js或任何其他promises / A +实现如何将代码转换为......

console.log('step 1');
setTimeout(function() {
  console.log('step 2');
  setTimeout(function() {
    console.log('step 3');
  }, 100);
}, 300);

进入承诺实施?

4 个答案:

答案 0 :(得分:3)

创建一个延迟函数,它返回一个Promise,它实际上在setTimeout中指定的时间过去之后解析它,就像这样

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");
    });

答案 1 :(得分:1)

将承诺链接起来:

// 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)

您可以在此处阅读更多内容:http://www.toptal.com/javascript/javascript-promises

答案 2 :(得分:1)

如果您对使用q感到满意,那么图书馆就会有一个非常简单的解决方案:

console.log('step 1');
Q.delay(300).then(function() {
    console.log('step 2');
    return Q.delay(200);
}).then(function() {
    console.log('step 3');
});

答案 3 :(得分:1)

关注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 chain日志语句而不是将回调权传递给setTimeout

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");
});