【问题标题】:How to perform a simple yield in javascript/node....?如何在 javascript/node.... 中执行简单的收益?
【发布时间】:2015-08-08 17:01:34
【问题描述】:

我尝试了以下几种组合都没有效果。我只是想暂停执行并在准备好后返回路由器功能,然后释放响应。这可能吗?

var express = require('express');
var router = express.Router();
var request = require('request');

router.get('/', function(req, res, next) {

    var result = getJson();

    res.render('index', { title: result});

});


function *getJson(){
    yield request('https://myjson.json', function (error, response, body){
        return body;
    });
}




module.exports = router;

【问题讨论】:

  • 你正在产生 request() 的返回,而不是 body 在其中返回。
  • 我在这里没有看到任何简单而干净的方式来使用 yield (描述了丑陋的复杂方式 here)。在 ES7 之前,Promise 可能是您需要的解决方案。
  • 如果您只想返回 JSON,只需将 res.render 放入 request 回调。你不需要产生任何东西,除非你有更高层次的最终目标,让事件循环处理它。
  • 您可以像这样使用生成器:jsfiddle.net/oybcq94g,但这可能会破坏您想要完成的目标。

标签: javascript node.js yield


【解决方案1】:

您要查找的是async/await,而不是yieldyield 用于枚举时使用。您可以在Mozilla Developer Networkthis SO answer 上阅读更多相关信息。

async/await 都是 ECMAScript 7 语言特性,所以它们在浏览器中还没有原生可用。您可以使用Traceur 编译器将 ES7 代码翻译/编译/转译成 ES5 代码,但我还没有尝试过。一个example can be found here

generators 和yield 的使用方式与async/await, check out this article by Jake Archibald 的用法类似。

【讨论】:

  • 哦,废话,要等好几年才能实施?
  • 由于您使用的是 NodeJS,您也许可以使用github.com/yortus/asyncawait。或者只是使用 Traceur 将 ES7 代码编译成今天可用的东西,它也可以在浏览器中使用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2013-07-03
相关资源
最近更新 更多