2015-04-01 50 views
1

使用rsvp.js或任何其他的承诺/ A +实现我怎么能把这样的代码......如何嵌套一个定时器,转换为承诺

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

为承诺实施?

回答

3

创建一个延迟函数,它返回一个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"); 
    }); 
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) 

你可以在这里阅读更多:如果你没事使用qhttp://www.toptal.com/javascript/javascript-promises

1

,还有烤成库一个非常简单的解决方案:

console.log('step 1'); 
Q.delay(300).then(function() { 
    console.log('step 2'); 
    return Q.delay(200); 
}).then(function() { 
    console.log('step 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而不是通过回调右转入setTimeoutchain日志声明:

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