【问题标题】:Why Yield is not working with request module?为什么 Yield 不适用于请求模块?
【发布时间】:2018-06-19 19:13:41
【问题描述】:

我有一个场景,我有一个需要使用请求 npm 模块同步评估的 URL 数组。详细来说,数组将是 forEach,它应该为当前 url 带来数据,然后只移动到选择下一个 url。我正在使用产量生成器。但它不起作用。请大家帮忙!

var Promise = require("bluebird");
var request = Promise.promisify(require("request"), {multiArgs: true});
Promise.promisifyAll(request, {multiArgs: true})
var url_arr = ["https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=AIzaSyDe3MyoHI6aSbYKdHOXloz9QepAMfes9XE", "https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=AIzaSyDe3MyoHI6aSbYKdHOXloz9QepAMfes9XE"];


function* fetch(obj) {
  console.log("2")
  var myobj = yield request.getAsync(obj).promise();
  console.log("3", myobj)
  return myobj;
}

url_arr.forEach(function (obj){
  console.log("1", obj)
  var output = fetch(obj);
  console.log("4, ", output);
});

在上面的 sn-p 中,只有 1 && 4 打印在控制台中。我认为从来没有评估过二和三。

【问题讨论】:

  • “评估”是什么意思?你为什么在生成器函数中return?
  • 请注意,问题中的代码似乎使用.forEach() 将异步代码与同步代码混合在一起。预期结果是要在.forEach() 中记录的异步请求的响应吗?

标签: javascript node.js ecmascript-6 generator yield


【解决方案1】:

从生成器函数中删除 return 语句,它会暂停生成器,调用 .next() 以获取 yielded 对象的 value

function* _fetch(obj) {
  var myobj = yield obj;
}

[1,2,3].forEach(function (obj) {
  var {value:output} = _fetch(obj).next();
  console.log("output:", output);
});

【讨论】:

  • 谢谢老哥成功了!!!!现在我想问一下我们可以自动化这个过程并删除 .next() 吗?
  • 根据您要实现的目标,您可以使用yield 表达式和for..of 循环function* _fetch(obj) { var myobj = yield* obj; }; for (let prop of _fetch([1,2,3])) { console.log(prop) }
猜你喜欢
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2012-07-23
  • 2020-12-16
  • 2016-06-02
  • 1970-01-01
  • 2016-12-16
相关资源
最近更新 更多