node.js - nodejs的co模块自执行为题yield
伊谢尔伦
伊谢尔伦 2017-05-16 13:35:43
[Node.js讨论组]

我的代码是这样的

const co = require('co');

function are(){

}

function* abc(){
    var a = yield are()
    console.log(1)
    var b = yield are()
    console.log(2)
    var c = yield are()
    console.log(3)
}

co(abc)

我预期的执行结果,控制台应该打印出 1,2,3

但是在执行的时候,程序却报错了

应该说是我的yield后面应该跟function但是上面的demo中我的yield后面跟的已经是function了为什么却没有预期的输出呢?

第二种写法:

const co = require('co');

function are1(){

}
function are2(){

}
function are3(){

}

function* abc(){
    var a = yield are1
    console.log(1)
    var b = yield are2
    console.log(2)
    var c = yield are3
    console.log(3)
}

co(abc)
    .then(data =>{
        console.log(data)
    })
    .catch(err =>{
        console.log(err)
    })

co已经接受一个generator的函数了,上面的这种写法也是没办法在控制台输出1,2,3的

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
漂亮男人

你的yield后面跟的不是are这个函数,而是are执行后的返回值。
其实它等于yield undefined,这才是报错的原因。

某草草
function* are(){

}
伊谢尔伦

不支持普通函数

PHPz

看看co库的源码就好,报错是co库报出来的,原因是因为楼上说的返回了undefined,具体报错代码如下:

if (value && isPromise(value)) 
    return value.then(onFulfilled, onRejected);
return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, '
+ 'but the following object was passed: "' + String(ret.value) + '"'));

isPromise检测是否为Promiseco库先尝试将yield后转换为Promise,具体参见toPromise函数:

function toPromise(obj) {
  if (!obj) return obj;
  if (isPromise(obj)) return obj;
  if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);
  if ('function' == typeof obj) return thunkToPromise.call(this, obj);
  if (Array.isArray(obj)) return arrayToPromise.call(this, obj);
  if (isObject(obj)) return objectToPromise.call(this, obj);
  return obj;
}

传入的是undefined,所以最终toPromise返回了undefined,检测不是Promise,所以就抛出了错误。

至于为什么没有输出1,2,3的原因,是因为yield后面的关系,yield后面是要接受函数作为参数,并且要执行这个函数的,所以yield后面一般跟着的是异步操作,这个函数就是回调函数,但是的那个函数,所以这么改下就可以了:

function are1(fn) {
    fn();
}
function are2(fn) {
    fn();
}
function are3(fn) {
    fn();
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号