Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 为什么我的迭代器再次被提升?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下程序 – 我使用genny.js来处理异步流控制 – 我尝试了与suspend.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

很奇怪 – 我不明白.有人比我聪明,请解释一下.

updatE

我已经更改了代码调用条带方法而没有回调或
迭代器恢复功能.现在它有效.但是 – 奇怪的是 – 在“结果”处查看控制台.我不明白为什么.所以现在它没有“第二次”调用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

解决方法

您遇到的问题源于两种异步方法的混合.

stripe API docs提到

但是,gennysuspend都这样做

这就是你的错误:在线

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,请注明来意。