相关疑难解决方法(0)

如何在.then()链中访问先前的promise结果?

我已经将我的代码重组为承诺,并构建了一个由多个回调组成的精彩长扁平承诺链.then().最后我想返回一些复合值,并且需要访问多个中间承诺结果.但是,序列中间的分辨率值不在最后一个回调的范围内,我该如何访问它们?

function getExample() {
    return promiseA(…).then(function(resultA) {
        // Some processing
        return promiseB(…);
    }).then(function(resultB) {
        // More processing
        return // How do I gain access to resultA here?
    });
}
Run Code Online (Sandbox Code Playgroud)

javascript scope promise bluebird es6-promise

607
推荐指数
10
解决办法
18万
查看次数

了解带有fs模块的节点JS生成器

我一直对Node JS感到非常兴奋.我最终决定关注并编写一个测试项目,以了解最新的Harmony构建Node中的生成器.

这是我非常简单的测试项目:

https://github.com/kirkouimet/project-node

要运行我的测试项目,您可以轻松地从Github中提取文件,然后运行它:

node --harmony App.js
Run Code Online (Sandbox Code Playgroud)

这是我的问题 - 我似乎无法让Node的异步fs.readdir方法与生成器内联运行.其他项目,如Galaxy暂停似乎能够做到这一点.

这是我需要修复的代码块.我希望能够实例化FileSystem类型的对象并在其上调用.list()方法:

https://github.com/kirkouimet/project-node/blob/4c77294f42da9e078775bb84c763d4c60f21e1cc/FileSystem.js#L7-L11

FileSystem = Class.extend({

    construct: function() {
        this.currentDirectory = null;
    },

    list: function*(path) {
        var list = yield NodeFileSystem.readdir(path);

        return list;
    }

});
Run Code Online (Sandbox Code Playgroud)

我是否需要提前做一些事情才能将Node的fs.readdir转换为生成器?

一个重要的注意事项,我正在解析创建它们时的所有类函数.这使我能够处理生成器函数与普通函数不同:

https://github.com/kirkouimet/project-node/blob/4c77294f42da9e078775bb84c763d4c60f21e1cc/Class.js#L31-L51

我对这个项目感到非常难过.会喜欢任何帮助!

这是我想要完成的:

  1. 大量使用具有继承的John Resig的JavaScript类支持的修改版本的类
  2. 使用生成器获取Node的库存异步调用的内联支持

编辑

我试图实现你的示例函数,我遇到了一些麻烦.

list: function*(path) {
    var list = null;

    var whatDoesCoReturn = co(function*() {
        list = yield readdir(path);
        console.log(list); // This shows an array of files (good!)
        return list; // Just my guess …
Run Code Online (Sandbox Code Playgroud)

javascript asynchronous generator node.js ecmascript-6

8
推荐指数
2
解决办法
3427
查看次数

ECMA6发电机:产量承诺

据我了解,ECMA6生成器应该能够屈服于一个返回promise的函数,最终返回已解决/拒绝的函数.使代码读取更像同步代码,并避免回调地狱.

我正在使用带有--harmony的node.js v0.12.2和以下代码.

var someAsyncThing = function() {
  return new Promise(function(resolve, reject) {
    resolve("I'm Resolved!");
  });
};

someAsyncThing().then(function(res) {console.log(res);});
// Works as expected: logs I'm Resolved!

function* getPromise() {
    var x = yield someAsyncThing();
    console.log("x: " + x); // Fails x undefined
}

var y = getPromise();
console.log(y); // returns {}

console.log(y.next());
// Fails: logs { value: {}, done: false }
Run Code Online (Sandbox Code Playgroud)

我的代码基于我能够在网上找到的几个例子.我究竟做错了什么?

javascript node.js ecmascript-6

8
推荐指数
2
解决办法
6745
查看次数

使用generator函数next()作为node.js中的回调

我正在编写一些node.js来通过串口连接与传感器进行交互.用于读取传感器的代码当然是异步的.但是,在我的控制代码中,我需要读取传感器,根据值执行某些操作,再次读取,执行其他操作等.为此,我使用的代码类似于以下自包含测试:

var main = new Main();
main.next();

function* Main()
{
  var reading = yield readSensor(this.next.bind(this));
  console.log(reading);

  var reading = yield readSensor(this.next.bind(this));
  console.log(reading);
}

function readSensor(callback)
{
  // simulate asynchrounous callback from reading sensor
  setTimeout(function sensorCallback() { callback('foo'); }, 100);
}
Run Code Online (Sandbox Code Playgroud)

所以,我的顺序控制代码在一个生成器中,readSensor()当它需要读取时产生.传感器读取完成后,它会调用回调,然后控制返回主代码.我这样做是因为我可能需要根据之前的读数以不同的顺序读取各种传感器.所以,这是一个值得怀疑的部分:我this.next.bind(this)作为回调函数传递给异步读取函数.当启用生成器(--harmony_generators)时,代码似乎工作,但我想知道这里是否存在我遗漏的陷阱.我对JS比较新,所以不要害怕指出明显的:)

javascript yield node.js

5
推荐指数
1
解决办法
931
查看次数

使用生成器暂停直到承诺解决

我在 node.js 中有一个批处理作业: 将文件复制到目录中,对文件进行分析,然后删除文件。

我想迭代一系列作业并使用生成器暂停执行,直到批处理作业完成,然后再开始另一个作业。这是我到目前为止所拥有的:

const cars = ["toyota", "honda", "acura"];

function copyFilesAndRunAnalysis(car) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() { // simulate some delay
      resolve(); // control should return to generator here
    }, 1000);
  });
}

function* doCar(car) {
  yield copyFilesAndRunAnalysis(car);
}

// BEGIN HERE
console.log('start here');
carBatch = doCar(cars[0]);
carBatch.next(); // confusion here!!!
carBatch.next(); // should this all be in a forEach loop?
Run Code Online (Sandbox Code Playgroud)

我想做的是有一个 forEach 循环每辆车,完成该copyFilesAndRunAnalysis方法中的所有相应工作 - 暂停直到Promise.resolve()然后继续到下一辆。尝试 forEach 根本不会让任何东西运行。

javascript generator node.js ecmascript-6 es6-promise

5
推荐指数
1
解决办法
4115
查看次数

ES6发电机 - 他们真的可以替代异步/等待吗?

这篇打字稿博客文章评论部分的帖子之一说:

如果我必须等到2.0以获得ES6发电机支持,我就会坚持使用Traceur.生成器是一个大问题,他们今天使用Koa,Co,Bluebird等库为您提供异步/等待支持.

Async/await关键字将允许应用程序保留类似于同步代码的逻辑结构.如何使用发电机来完成类似的事情呢?例如,如何将生成器与ajax调用结合使用以生成避免使用回调的同步样式代码?

javascript generator async-await typescript ecmascript-6

4
推荐指数
1
解决办法
4747
查看次数

async/await vs组合生成器和承诺?

MDN文档

async/await函数的目的是简化同步使用promises的行为,并对一组Promises执行某些行为.就像Promise类似于结构化回调一样,async/await类似于组合生成器和promise.

我理解async/await,generator和promise的基本概念.但是,我并不完全理解async/await类似于组合生成器和promise的含义.

那么异步/等待简化了生成器和承诺可以一起做什么?任何例子?

javascript generator promise async-await

1
推荐指数
1
解决办法
1087
查看次数