我已经将我的代码重组为承诺,并构建了一个由多个回调组成的精彩长扁平承诺链.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) 我一直对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()方法:
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转换为生成器?
一个重要的注意事项,我正在解析创建它们时的所有类函数.这使我能够处理生成器函数与普通函数不同:
我对这个项目感到非常难过.会喜欢任何帮助!
这是我想要完成的:
我试图实现你的示例函数,我遇到了一些麻烦.
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) 据我了解,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)
我的代码基于我能够在网上找到的几个例子.我究竟做错了什么?
我正在编写一些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比较新,所以不要害怕指出明显的:)
我在 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 根本不会让任何东西运行。
这篇打字稿博客文章评论部分的帖子之一说:
如果我必须等到2.0以获得ES6发电机支持,我就会坚持使用Traceur.生成器是一个大问题,他们今天使用Koa,Co,Bluebird等库为您提供异步/等待支持.
Async/await关键字将允许应用程序保留类似于同步代码的逻辑结构.如何使用发电机来完成类似的事情呢?例如,如何将生成器与ajax调用结合使用以生成避免使用回调的同步样式代码?
async/await函数的目的是简化同步使用promises的行为,并对一组Promises执行某些行为.就像Promise类似于结构化回调一样,async/await类似于组合生成器和promise.
我理解async/await,generator和promise的基本概念.但是,我并不完全理解async/await类似于组合生成器和promise的含义.
那么异步/等待简化了生成器和承诺可以一起做什么?任何例子?
javascript ×7
ecmascript-6 ×4
generator ×4
node.js ×4
async-await ×2
es6-promise ×2
promise ×2
asynchronous ×1
bluebird ×1
scope ×1
typescript ×1
yield ×1