Promise对象中的setTimeout

Saumya Ranjan Satapathy

我开始使用JS和NodeJS。在编写hello-world应用程序时,遇到了setTimeout的不同行为。如果我能知道造成这种差异的原因,那就太好了。

方案1:响应等待5秒钟
方案2:尽管将超时设置为5秒,请求立即得到解决

两种情况下的代码差异是:在方案1中,setTimeout具有匿名函数,在方案2中,它调用同一模块中的另一个函数。

Calculator.js

方案1:

module.exports.addNumbers = function(numberArray){

    return new Promise(function(fullfil, reject){
        setTimeout(() => {
            if(!(typeof numberArray === 'Array'))
                reject('Not number elements found!');
        },5000);
        //fullfil(10000);
    });

}

在此处输入图片说明

方案2:

module.exports.addNumbers = function(numberArray){
    return new Promise(function(fullfil, reject){
        setTimeout(add(numberArray, fullfil, reject),5000);
        //fullfil(10000);
    });
}

function add(numberArray, fullfil, reject){
    if(!(typeof numberArray === 'Array'))
        reject('Not number elements found!');
}

在此处输入图片说明

路由器(两种情况相同):

var express = require('express');
var router = express.Router();
var calculator = require('../services/calculator');

router.get('/',function(req,res,next){

    //res.writeHeader(200,{'content-type':'text/plain'});

    res.send('Hello World - ' + JSON.stringify(res));
    console.log(res);
});

router.get('/testpromise',function(req,res,next){

    calculator.addNumbers('First Try')
        .then(function(result){
            res.send(' Final Result ## '+result);
        })
        .catch(function(err){
            res.send(' ERROR MSG ## '+err);
            console.error(' ERROR MSG ##' +err);
        });

});

module.exports = router;
ᴘᴀɴᴀʏɪᴏᴛɪs

第一个参数setTimeout必须是要调用的函数。

在第一个示例中,您将提供这样的功能(() => {}):

  setTimeout(() => {
        if(!(typeof numberArray === 'Array'))
            reject('Not number elements found!');
    },5000);

但是,在第二个示例中,您没有传递函数作为第一个参数,而是直接调用了该函数(因此将在该函数中对其进行求值)。

setTimeout(add(numberArray, fullfil, reject),5000);

至于我可以看到add(numberArray, fullfil, reject)没有返回功能。

您可以这样做将其包装为一个函数:

setTimeout(() => add(numberArray, fullfil, reject),5000);

或使add返回函数:

function add(numberArray, fullfil, reject){
    return () => {
        if(!(typeof numberArray === 'Array'))
            reject('Not number elements found!');
    }
}
// or 
function add(numberArray, fullfil, reject){
    return function() {
        if(!(typeof numberArray === 'Array'))
            reject('Not number elements found!');
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Javascript

如何将setTimeout包装在Promise中

来自分类Javascript

Promise vs setTimeout

来自分类Dev

级联的Promise中缺少对象变量

来自分类Dev

setTimeout阻止子进程中的Promise

来自分类Dev

在promise回调中访问对象的“ this”(然后)

来自分类Dev

R中的promise对象是什么?

来自分类Dev

在Typescript / JavaScript中解开Promise对象

来自分类Dev

在promise中向setTimeout添加另一个延迟

来自分类Dev

在Promise.all响应中命名对象?

来自分类Dev

从已解决的Promise对象中检索值

来自分类Dev

setTimeout如何在JavaScript中的Promise中工作?

来自分类Dev

使用Promise包装器的setTimeout在Jest async / await中无法按预期工作

来自分类Dev

在for循环中解析setTimeout函数中的promise

来自分类Dev

在Promise中为对象分配值

来自分类Dev

从Promise对象的实例内执行的setTimeout函数捕获异常

来自分类Dev

递归setTimeout中的递归setTimeout

来自分类Dev

从Javascript的setTimeout函数中更新对象的属性值

来自分类Dev

从then函数中访问promise对象

来自分类Dev

解决javascript对象中的Promise

来自分类Dev

在promise中访问ES6中的此对象

来自分类Dev

Promise Angular2中的空对象

来自分类Dev

setTimeout 晚于 Promise

来自分类Dev

javascript promise:promise 竞赛中的 setTimeout 问题

来自分类Dev

Promise 中的 setTimeout - 如何解决以及为什么它只运行一次?

来自分类Dev

如何从 React 中的 Promise 对象检索数据?

来自分类Dev

从 nodejs 中的 promise 返回 JavaScript 对象的问题

来自分类Dev

React - Promise 中的 setTimeout 会闪烁 UI 元素,随机返回未定义的数组

来自分类Dev

在 setTimeout() 中调用对象方法

来自分类Dev

在 Javascript 中为 Promise.all 编写 Polyfill 时如何处理 setTimeout 情况

Related 相关文章

热门标签

归档