任何人都可以帮助我获得承诺吗?

时间:2017-03-14 18:00:35

标签: javascript promise

我需要创建一个函数'timer',它返回一个promise并接受一个参数(毫秒数)。承诺应该在争论时间进入国家“履行”。它不会延迟新的Promise。

function timer(del) {
    return new Promise( function (resolve, reject) { 
        resolve(del);
    });
    setTimeout(timer, del);
};

timer(3000).then(function(val) {
    console.log ('I\'m shown in ' + (val / 1000) + ' seconds'); 
});

2 个答案:

答案 0 :(得分:2)

在解决承诺之前你没有等待,你正在诺言执行函数中做到这一点。 setTimeout也是死代码,因为前面有return;如果没有返回,那么每次运行时你都会设置timer来自行调用(延迟后)。

function timer(del) {
    return new Promise(function(resolve, reject) {
        resolve(del);       // <==== You're doing this right away
    });
    // The following is dead code since you already `return`ed
    setTimeout(timer, del); // <==== This would call `timer` later, setting up a repeat
}

相反,请使用计时器调用resolve

function timer(del) {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve, del, del);
  });
}
timer(3000).then(function(val) {
  console.log('I\'m shown in ' + (val / 1000) + ' seconds');
});

旁注:此行

setTimeout(resolve, del, del);

适用于任何现代浏览器。对于不支持通过setTimeout传递参数的旧版浏览器,您可以执行以下操作:

setTimeout(resolve.bind(null, del), del);

或者这个:

setTimeout(function() {
    resolve(del);
}, del);

答案 1 :(得分:0)

function timer(del) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, del)
  });
}