Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺不等待超时_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 承诺不等待超时

Javascript 承诺不等待超时,javascript,node.js,promise,Javascript,Node.js,Promise,我正在学习Promise library,但遇到了以下问题 //Function for getting sum function getSum(n1, n2) { var isAnyNegative = function() { return n1 < 0 || n2 < 0; } var promise = new Promise(function(resolve, reject) {

我正在学习Promise library,但遇到了以下问题

//Function for getting sum
    function getSum(n1, n2) {   
       var isAnyNegative = function() {   
          return n1 < 0 || n2 < 0;   
       }
       var promise = new Promise(function(resolve, reject) {   
          if (isAnyNegative()) {   
             reject(Error("Negatives not supported"));   
          }   
          resolve(n1 + n2)
       });   
       return promise;   
    }

 ////Function for getting Difference
    function getDiff(n1,n2){
        var diff = n1-n2;
        setTimeout(function(){
            console.log("value of diff--- ", diff)
            return diff;
        }, 2000)
    }

    getSum(5,6)
    .then(function(callbackResult){
        console.log("first callback-Result- ", callbackResult)
        return getDiff(14,11);
    }, function(error){
        //handling error
    })
    .then(function(callbackResult){
        console.log("second callback--Result- ", callbackResult)
        return getSum(22,22);
    }, 
    function(error){
        //handling error
    })
    .then(function(callbackResult){
        console.log("third callback--Result- ", callbackResult)
    }, function(error){
        //handling error
    })

为什么第二个回调不等待差分函数返回呢。我认为这是Promise库同步代码的主要功能。

您必须以异步方式处理
setTimeout
。例如:

function getDiff(n1,n2){
   return new Promise((resolve) => {
        const diff = n1 - n2;

        setTimeout(() => {
            console.log('value of diff--- ', diff);

            return resolve(diff);
        }, 2000);
    }
});

您必须以异步方式处理
setTimeout
。例如:

function getDiff(n1,n2){
   return new Promise((resolve) => {
        const diff = n1 - n2;

        setTimeout(() => {
            console.log('value of diff--- ', diff);

            return resolve(diff);
        }, 2000);
    }
});

因为您在超时时间内以匿名函数返回diff。如果要等待承诺链,必须从getDiff返回承诺实例,就像前面在getSum中所做的那样

function getDiff(n1,n2){
    var diff = n1-n2;
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            console.log("value of diff--- ", diff)
            resolve(diff);
        }, 2000);
    });
}

因为您在超时时间内以匿名函数返回diff。如果要等待承诺链,必须从getDiff返回承诺实例,就像前面在getSum中所做的那样

function getDiff(n1,n2){
    var diff = n1-n2;
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            console.log("value of diff--- ", diff)
            resolve(diff);
        }, 2000);
    });
}

是的,有点像。但是setTimeout也是一个异步调用看看@GrégoryNEUT的答案。事实上,当您在超时中返回时,您不会在diff函数中返回。例如,
map
方法也是如此
function x(){array.map(function(el){return el});}
调用
x()
时,它不会返回列表中的第一个元素。是的,它有点像。但是setTimeout也是一个异步调用看看@GrégoryNEUT的答案。事实上,当您在超时中返回时,您不会在diff函数中返回。例如,
map
方法也是如此
function x(){array.map(function(el){return el});}
调用
x()
时不会返回列表中的第一个元素。如果使用库,另一个选项是使用
Bluebird.delay(2000)
,它会等待2秒,然后解析返回的承诺。@Griffin yes您可以这样做,但是当
node.js
现在支持原生的
Promises
时,为什么要使用
Bluebird
呢?当然,这是一个很好的观点,es6得到了很多新东西。我喜欢使用Bluebird和lodash等东西的原因有两个,尽管原生JavaScript支持它们:1。即使您可以控制服务器的环境和节点版本,您也无法控制人们访问您网站的浏览器,因此如果您有使用这些功能的前端代码,即使Safari有时也不支持这些功能。这些库可以为您多填充,因此您不必担心。2.像这样的实用函数库可以让我省去打字,而且很容易理解它们在做什么。@Griffin theses是正确的:)。只是说你也可以用它来处理浏览器兼容性的问题。这两种方法都有效,我想这更多地取决于您现有的体系结构。如果您正在使用该库,另一种选择是使用
Bluebird.delay(2000)
,它等待2秒,然后解析返回的承诺。@Griffin是的,您可以这样做,但是当
node.js
现在支持原生的
Promises
时,为什么要使用
Bluebird
呢?当然,这是一个很好的观点,es6得到了很多新东西。我喜欢使用Bluebird和lodash等东西的原因有两个,尽管原生JavaScript支持它们:1。即使您可以控制服务器的环境和节点版本,您也无法控制人们访问您网站的浏览器,因此如果您有使用这些功能的前端代码,即使Safari有时也不支持这些功能。这些库可以为您多填充,因此您不必担心。2.像这样的实用函数库可以让我省去打字,而且很容易理解它们在做什么。@Griffin theses是正确的:)。只是说你也可以用它来处理浏览器兼容性的问题。这两种方法都有效,我想这更多地取决于您现有的体系结构。