nodejs承诺从settimeout实现的最佳方法

时间:2019-12-12 15:56:38

标签: javascript node.js promise request-promise

我在nodejs中有以下功能,但是我使用的是setTimeout而不是promise。如果createchange花费的时间超过我的超时时间,则我的代码将失败,但无法正确捕获错误。

在继续执行代码之前,我将如何替换或更改以下功能以与Promise一起使用,以便deploychange等待createchange完成。

我尝试了几件事,但似乎没有任何效果。不知道我应该重做哪种功能以获得最有效的解决方案。

任何帮助将不胜感激。

第一个功能

function createchange(accessToken){
        const data = {
            templateName: "Template 1",
            summary: "Deploy  Change",

            configurationItems: [
              config_item
            ],
            wasEnvUsedForTesting: false,
            environment: test_env
          };

        rp({
            url: dbConfig.cmas_url,
            resolveWithFullResponse: true,
            method: 'POST',
            json: true,
            auth: {
            bearer: accessToken
            },
            body: data,
            headers: {
            'Content-Type': 'application/json',
            'apikey': dbConfig.consumer_key,
            },
        }, function(err, res) {
            if(err){
                console.log(err.body);
            }else{
                console.log(res.body);
                crq = res.body.changeid;
            }

        });
    }

第二个功能

  function run() {
           deploychange();
          setTimeout(function(){ deployinsert(); }, 7500);
           deployrun();
      }

第三个功能

        function deploychange (callback) {
        if (req.body.deployEnv == "PRD"){
          getToken(function(accessToken) {
          createchange(accessToken);   
          })}; 

        } 

1 个答案:

答案 0 :(得分:0)

根据请求承诺文档,rp返回一个promise。

您实际上可以将createChange函数转换为返回promise,如下所示:

const createchange = accessToken => {
    const data = {
        templateName: 'Template 1',
        summary: 'Deploy  Change',

        configurationItems: [config_item],
        wasEnvUsedForTesting: false,
        environment: test_env
    };

    return rp({
        url: dbConfig.cmas_url,
        resolveWithFullResponse: true,
        method: 'POST',
        json: true,
        auth: {
            bearer: accessToken
        },
        body: data,
        headers: {
            'Content-Type': 'application/json',
            apikey: dbConfig.consumer_key
        }
    });
};

然后可以使用await关键字调用函数。

await createchange(accessToken);

确保使用await的函数已标记为异步

您也可以这样写:

createchange(accessToken)
    .then(({changeId}) => {
        // Do someth with the changeId
    })
    .catch(/* Error handling */)