Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 nodejs承诺了从settimeout实现的最佳方法_Javascript_Node.js_Promise_Request Promise - Fatal编程技术网

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

Javascript nodejs承诺了从settimeout实现的最佳方法,javascript,node.js,promise,request-promise,Javascript,Node.js,Promise,Request Promise,我在nodejs中使用了以下函数,但我使用的是setTimeout,而不是promise。如果createchange花费的时间超过了超时时间,则我的代码将失败,但无法正确捕获错误 我将如何替换或更改以下函数以使用承诺,以便deploychange在继续执行代码之前等待createchange完成 我试过几种方法,但似乎都不管用。不确定为了获得最有效的解决方案,我应该重做哪个函数 任何帮助都将不胜感激 第一功能 function createchange(accessToken){

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

我将如何替换或更改以下函数以使用承诺,以便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 run() {
           deploychange();
          setTimeout(function(){ deployinsert(); }, 7500);
           deployrun();
      }
第三功能

  function run() {
           deploychange();
          setTimeout(function(){ deployinsert(); }, 7500);
           deployrun();
      }
        function deploychange (callback) {
        if (req.body.deployEnv == "PRD"){
          getToken(function(accessToken) {
          createchange(accessToken);   
          })}; 

        } 

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

实际上,您可以将createChange函数转换为返回如下承诺:

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
        }
    });
};
然后可以使用wait关键字调用函数

await createchange(accessToken);
确保使用await的函数标记为async

你也可以这样写:

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

我将尝试一下Bastien使用async。我仍然可以使用data.body.changeId调用我的changeId吗?当然,createChange函数将返回经典回调函数的
res
部分。
err
部分将被抛出/捕获。因此您基本上可以这样做:
const res=await createchange(accessToken)
和访问
res.body.changeid
@Spring\u重新启动,您需要更多信息来解决问题。总之,
deploychange()
应该返回promisified,为了返回promisified,
getToken()
必须是“promisified”。从
createChange()
返回承诺只是解决方案的一部分。