Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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_Google Cloud Functions - Fatal编程技术网

Javascript:编写返回承诺的函数

Javascript:编写返回承诺的函数,javascript,google-cloud-functions,Javascript,Google Cloud Functions,我试图在Firebase函数中创建一个函数,该函数返回一个承诺(或者同步返回,我不介意),但没有成功 以下是我编写的函数: function doSomethingLong(param) { https.get('http://www.myurl.com?param=' + param, (resp) => { let data = ''; // A chunk of data has been recieved. resp.on(

我试图在Firebase函数中创建一个函数,该函数返回一个承诺(或者同步返回,我不介意),但没有成功

以下是我编写的函数:

function doSomethingLong(param) {
    https.get('http://www.myurl.com?param=' + param, (resp) => {
        let data = '';

        // A chunk of data has been recieved.
        resp.on('data', (chunk) => {
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            console.log("Call succeeded. Response: " + data);
            return true;
        });
    }).on("error", (err) => {
        console.log("Call failed. Error: " + err.message);
        return false;
    });
}
我想在Firebase发生某种变化时调用它,并等待它完成,比如:

exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => {
    const param = event.data.val();

    if (doSomethingLong(param)) {
        console.log("ttt");
    } else {
        console.log("fff");
    }
    return null;
})
不管我怎么做,
someFunction
函数在
doSomethingLong
结束之前结束


有什么线索吗?

异步任务结束时,您必须创建一个承诺并解决/拒绝它

function doSomethingLong(param) {

   return new Promise(function(resolve, reject){

       https.get('http://www.myurl.com?param=' + param, (resp) => {
          let data = '';

          // A chunk of data has been recieved.
          resp.on('data', (chunk) => {
              data += chunk;
          });

          // The whole response has been received. Print out the result.
          resp.on('end', () => {
              console.log("Call succeeded. Response: " + data);
              resolve();
          });
      }).on("error", (err) => {
          console.log("Call failed. Error: " + err.message);
          reject(err);
      });
   });
}
现在你可以这样使用它了

doSomethingLong()
   .then(function() {
      console.log(pased)
   },

   function(err) {
     console.log(err)
   }

)

您必须创建一个承诺,并在异步任务结束时解决/拒绝它

function doSomethingLong(param) {

   return new Promise(function(resolve, reject){

       https.get('http://www.myurl.com?param=' + param, (resp) => {
          let data = '';

          // A chunk of data has been recieved.
          resp.on('data', (chunk) => {
              data += chunk;
          });

          // The whole response has been received. Print out the result.
          resp.on('end', () => {
              console.log("Call succeeded. Response: " + data);
              resolve();
          });
      }).on("error", (err) => {
          console.log("Call failed. Error: " + err.message);
          reject(err);
      });
   });
}
现在你可以这样使用它了

doSomethingLong()
   .then(function() {
      console.log(pased)
   },

   function(err) {
     console.log(err)
   }

)
像这样做

    function doSomethingLong(param) {
    return new Promise(function(resolve,reject){
        https.get('http://www.myurl.com?param=' + param, (resp) => {
            let data = '';

            // A chunk of data has been recieved.
            resp.on('data', (chunk) => {
                data += chunk;
            });

            // The whole response has been received. Print out the result.
            resp.on('end', () => {
                console.log("Call succeeded. Response: " + data);
                resolve(data);//resolve data
            });
        }).on("error", (err) => {
            console.log("Call failed. Error: " + err.message);
            reject(err);//reject(reason)
        });
    });
}


exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => {
    const param = event.data.val();

    if (addUserToNewsletter(user_id, name, email, language)) {
        console.log("ttt");
    } else {
        console.log("fff");
    }
    return null;
    let promise=doSomethingLong('foo');
    promise.then((data)=>{
        console.log(data);
    }).catch((err)=>{
        console.log(err);
    })
})
像这样做

    function doSomethingLong(param) {
    return new Promise(function(resolve,reject){
        https.get('http://www.myurl.com?param=' + param, (resp) => {
            let data = '';

            // A chunk of data has been recieved.
            resp.on('data', (chunk) => {
                data += chunk;
            });

            // The whole response has been received. Print out the result.
            resp.on('end', () => {
                console.log("Call succeeded. Response: " + data);
                resolve(data);//resolve data
            });
        }).on("error", (err) => {
            console.log("Call failed. Error: " + err.message);
            reject(err);//reject(reason)
        });
    });
}


exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => {
    const param = event.data.val();

    if (addUserToNewsletter(user_id, name, email, language)) {
        console.log("ttt");
    } else {
        console.log("fff");
    }
    return null;
    let promise=doSomethingLong('foo');
    promise.then((data)=>{
        console.log(data);
    }).catch((err)=>{
        console.log(err);
    })
})

你可以通过返回一个承诺、承诺、决心或承诺、拒绝,将两者结合起来

使您的代码看起来像这样:

 this.props.doSomethingLong(loginResult.credential)
          .then(result => this.someFunction(result))
          .catch(error => this.handleError(error.message))
这样做:

exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => {
const param = event.data.val();

if (addUserToNewsletter(user_id, name, email, language)) {
    console.log("ttt");
} else {
    console.log("fff");
}
return Promise.resolve();
})


在每次函数调用中执行此操作,您可以在中阅读更多有关承诺及其工作方式的信息。您可以通过返回承诺、承诺.resolve或承诺.reject将它们连接起来

使您的代码看起来像这样:

 this.props.doSomethingLong(loginResult.credential)
          .then(result => this.someFunction(result))
          .catch(error => this.handleError(error.message))
这样做:

exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => {
const param = event.data.val();

if (addUserToNewsletter(user_id, name, email, language)) {
    console.log("ttt");
} else {
    console.log("fff");
}
return Promise.resolve();
})


在每次函数调用中执行此操作,您可以阅读更多关于承诺及其如何在

中工作的信息,因此,您需要运行doSomethingLong,然后在resp.on('end')触发后,将结果“data”传递给某个函数,对吗?如果我没有弄错的话,这就是您试图实现的目标:(修复了原始问题中的一些误导性输入错误)@KostasX,我试图实现的是:当调用someFunction时,它应该调用doSomethingLong,等待它完成,然后才返回。因此,可能的重复是,您想要运行doSomethingLong,然后在resp.on('end')激发后,将结果“data”传递给someFunction,对吗?如果我没有弄错的话,这就是你想要达到的目标:(修正了原问题中一些误导性的拼写错误)@KostasX,我试图实现的是:当调用某个函数时,它应该调用doSomethingLong,等待它完成,然后才返回