Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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_Es6 Promise - Fatal编程技术网

Javascript 在异步操作完成之前解析承诺

Javascript 在异步操作完成之前解析承诺,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我想调用Google Maps API,并使用结果调用另一个API(这是我的最终目标,现在我只想将结果打印到控制台)。我的问题是,在API调用之前,承诺解决了,结果是未定义 routes.js const express = require('express'); const router = express.Router(); const geospacial = require('./geospacial.js'); const trailapi = require('./trailapi.

我想调用Google Maps API,并使用结果调用另一个API(这是我的最终目标,现在我只想将结果打印到控制台)。我的问题是,在API调用之前,承诺解决了,结果是未定义

routes.js

const express = require('express');
const router = express.Router();
const geospacial = require('./geospacial.js');
const trailapi = require('./trailapi.js');

router.get('/', (req, res, next) => {
  res.render('index');
});

router.post('/', (req, res, next) => {
  let activity = req.body.activity;
  let radius = req.body.radius;

  let getUserCoords = new Promise((resolve,reject) => {
    let userCoords = geospacial.getCoords(req.body.zip);
    resolve(userCoords);
  });

  getUserCoords.then((result) => {
    console.log("data: " + result);
  });
});
module.exports = router;
谷歌地图API(geospacial.js)


getCoords有一个异步调用,因此您需要在getCoords返回值之前解析承诺。您需要解析异步函数回调中的承诺

让getUserCoords=geospacial.getCoords(req.body.zip)


getCoords有一个异步调用,因此您需要在getCoords返回值之前解析承诺。您需要解析异步函数回调中的承诺

让getUserCoords=geospacial.getCoords(req.body.zip)


什么
getCoords
不返回承诺,因此它不起作用。 也许你可以这样改变它:

const getCoords = (addressData) => {
  return new Promise((resolve, reject) => {
        let body = '';
      let req = https.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + addressData + '&key=' + process.env.googleAPIKey, function(res) {
        res.on('data', function(data) {
          body += data;
        });
        res.on('end', function() {
          let result = JSON.parse(body);
          let coords = result.results[0].geometry.location;
          console.log(coords);
          resolve(coords);
        });
      });

      req.on('error', function(e) {
        console.error(e);
        reject(e)
      });

  })

};

什么
getCoords
不返回承诺,因此它不起作用。 也许你可以这样改变它:

const getCoords = (addressData) => {
  return new Promise((resolve, reject) => {
        let body = '';
      let req = https.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + addressData + '&key=' + process.env.googleAPIKey, function(res) {
        res.on('data', function(data) {
          body += data;
        });
        res.on('end', function() {
          let result = JSON.parse(body);
          let coords = result.results[0].geometry.location;
          console.log(coords);
          resolve(coords);
        });
      });

      req.on('error', function(e) {
        console.error(e);
        reject(e)
      });

  })

};

您的
getCoords
函数有一个缺陷:它从不返回任何内容。永远

https.get
是异步的,
req.on
也是异步的。因此,您在
getCoords
中执行了两个异步操作,但从未返回任何内容

您可能认为
'end'
事件处理程序中的return语句为
getCoords
返回,但它没有返回。事件处理程序中的返回为事件处理程序函数返回(在“
res.on('end',
”之后启动的函数)

别担心,你走的是正确的道路;使用
承诺

const getCoords = (addressData) => {
  return new Promise((resolve, reject) => {
    // do your stuff
    // when you want to return a value, resolve:
    resolve(apiResponse);
  });
};
现在
getCoords
将返回一个承诺

打印响应的代码现在应该有点像这样:

geospacial.getCoords(req.body.zip).then((result) => {
  console.log("data: " + result);
});
哪个

  • 调用
    geospacial.getCoords
  • 调用生成的
    承诺
    然后
  • (最终)解决并打印出您的结果

  • 您的
    getCoords
    函数有一个缺陷:它从不返回任何内容

    https.get
    是异步的,
    req.on
    也是异步的。因此,您可以在
    getCoords
    中执行两个异步操作,但从不返回任何内容

    您可能认为
    'end'
    事件处理程序中的return语句为
    getCoords
    返回,但它没有返回。事件处理程序中的返回为事件处理程序函数返回(在“
    res.on('end',
    ”之后启动的函数)

    别担心,你走的是正确的道路;使用
    承诺

    const getCoords = (addressData) => {
      return new Promise((resolve, reject) => {
        // do your stuff
        // when you want to return a value, resolve:
        resolve(apiResponse);
      });
    };
    
    现在
    getCoords
    将返回一个承诺

    打印响应的代码现在应该有点像这样:

    geospacial.getCoords(req.body.zip).then((result) => {
      console.log("data: " + result);
    });
    
    哪个

  • 调用
    geospacial.getCoords
  • 调用生成的
    承诺
    然后
  • (最终)解决并打印出您的结果

  • 新承诺
    应该在
    getCoords
    中执行,而不是在
    getUserCoords
    中执行。异步回调中的
    返回
    无效。
    新承诺
    应该在
    getCoords
    中执行。异步回调中的
    返回
    无效。您可以
    return
    在安装错误处理程序之前。最好将其放入promise executor回调中,并在发生时将其放入promise executor回调中。这正是我所需要的。谢谢!我仍在试图绕开promises。在安装错误处理程序之前,请将其放入promise executor调用中。最好将其放入promise executor调用中回来,当它发生时,
    拒绝
    。这正是我所需要的。谢谢!我仍在努力把我的头绕在承诺上。