大佬教程收集整理的这篇文章主要介绍了node.js – 为什么我的迭代器再次被提升?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Stripe nodejs API.
我的迭代器函数似乎被调用了两次 – 这导致了一个错误 – 我不明白为什么它会被调用两次.它一定是一个我没有看到的简单的头脑技巧.
var genny = require('genny') genny.longStackSupport = true var Stripe = require("Stripe")("sk_live_....") fetchCharges = genny.fn(function* (d) { console.log("Before fetchCharges") var charges = yield fetchList(d()) console.log("After fetchCharges - found ",charges.length) return true }) fetchList = genny.fn(function* (donE) { console.log("before fetchList") var results = yield Stripe.charges.list({},done()) console.log("after fetchList") return results.data }) genny.run(function* (resumE) { console.log('before run') yield fetchCharges(resume()) console.log('after run') })
控制台输出是:
> node --harmony genny.js before run Before fetchCharges before fetchList after fetchList After fetchCharges - found 10 after run /Volumes/dev/ingest/node_modules/genny/index.js:50 else throw e; ^ Error: callBACk already called at resume (/Volumes/dev/ingest/node_modules/genny/index.js:154:39) at throwAt (/Volumes/dev/ingest/node_modules/genny/index.js:49:30) at resume (/Volumes/dev/ingest/node_modules/genny/index.js:153:28) at tryProcessPending (/Volumes/dev/ingest/node_modules/genny/index.js:41:28) at resume (/Volumes/dev/ingest/node_modules/genny/index.js:164:17) at null._onTimeout (/Volumes/dev/ingest/node_modules/Stripe/lib/Striperesource.js:87:34) at Timer.listOnTimeout (timers.js:110:15) From generator: at /Volumes/dev/ingest/genny.js:22:26
现在,如果我用以下函数替换fetchList,它可以正常工作:
fetchList = genny.fn(function* (donE) { console.log('before doTimeout') console.log('1sec break ...') yield setTimeout(done(),1000); console.log('after doTimeout') return [] })
控制台输出是:
> node --harmony genny.js before run Before fetchCharges before doTimeout 1sec break ... after doTimeout After fetchCharges - found 0 after run
为了进一步说明迭代器的next()方法被调用两次这一事实 – 我有另一个(非工作)版本的程序.
var genny = require('genny') genny.longStackSupport = true var Stripe = require("Stripe")("sk_live_...") fetchCharges = genny.fn(function* (d) { console.log("Before fetchCharges") var charges = yield fetchList(function(err,cb) { console.log("callBACk") }) console.log("After fetchCharges - found ",done()) console.log("after fetchList") return results.data }) genny.run(function* (resumE) { console.log('before run') yield fetchCharges(resume()) console.log('after run') })
> node --harmony genny.js before run Before fetchCharges before fetchList after fetchList callBACk callBACk
这很奇怪 – 我不明白.有人比我聪明,请解释一下.
我已经更改了代码来调用条带方法而没有回调或
迭代器恢复功能.现在它有效.但是 – 奇怪的是 – 在“结果”处查看控制台.我不明白为什么.所以现在它没有“第二次”调用fetchList迭代器的next()函数 – 但是我看不到它甚至被调用一次!?
var results = yield Stripe.charges.list()
这是更新的完整程序.
var genny = require('genny') genny.longStackSupport = true var Stripe = require("Stripe")("sk_live_i6TrEk5lSRM1CmbSZZPsQzKc") fetchCharges = genny.fn(function* (d) { console.log(" fetchCharges {") var charges = yield fetchList(d()) console.log(" } fetchCharges - found ",charges.length) return true }) fetchList = genny.fn(function* (donE) { console.log(" fetchList {") var results = yield Stripe.charges.list({},function(err,results) { console.log("results ") }) console.log(" } fetchList") return results.data }) genny.run(function* (resumE) { console.log('Before run {') yield fetchCharges(resume()) console.log('} after run') })
这回来了
> node --harmony genny.js Before run { fetchCharges { fetchList { } fetchList } fetchCharges - found 10 } after run results
var results = yield Stripe.charges.list({},done())
你暗中同时使用两者. done()确实创建了一个传递给Stripe的回调,但是该调用也产生了一个产生的promise,而genny / suspend在它上面注册了另一个回调.这导致错误:已经调用的回调你正在观察.
您可以选择解决问题的方式:
>不要屈服于诺言
var results = yield void Stripe.charges.list({},done()) // ^^^^
>不要传递回调
var results = yield Stripe.charges.list({})
(我推荐后者)
以上是大佬教程为你收集整理的node.js – 为什么我的迭代器再次被提升?全部内容,希望文章能够帮你解决node.js – 为什么我的迭代器再次被提升?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。