node.js - modul co nodejs melaksanakan sendiri hasil
伊谢尔伦
伊谢尔伦 2017-05-16 13:35:43
0
4
683

Kod saya seperti ini

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)

Hasil pelaksanaan jangkaan saya, konsol harus mencetak 1, 2, 3

Tetapi apabila melaksanakan, program melaporkan ralat

Saya harus mengatakan ia milik sayayield后面应该跟function但是上面的demo中我的yield后面跟的已经是functionMengapa tiada output yang dijangkakan?

Cara penulisan kedua:

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)
    })

coSudah menerima fungsi penjana Kaedah penulisan di atas tidak boleh mengeluarkan 1,2,3 pada konsol

伊谢尔伦
伊谢尔伦

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

membalas semua(4)
漂亮男人

Milik andayield后面跟的不是are这个函数,而是are执行后的返回值。
其实它等于yield undefined, ini adalah sebab kesilapan.

某草草
function* are(){

}
伊谢尔伦

Fungsi biasa tidak disokong

PHPzhong

Cukup lihat kod sumber pustaka co Ralat dilaporkan oleh pustaka co Sebabnya adalah kerana seperti yang dinyatakan di atas, undefined dikembalikan Kod ralat khusus adalah seperti berikut: 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();
}
isPromise mengesan sama ada ia Promise Pustaka co mula-mula cuba menukar yield kepada Promise<. code>, lihat fungsi toPromise untuk butiran: 🎜 rrreee 🎜Input adalah undefined, jadi pada akhirnya toPromise mengembalikan undefined dan pengesanan bukan Promise, jadi ia adalah kesilapan yang dilemparkan. 🎜 🎜Mengenai mengapa 1,2,3 bukan output, ia adalah kerana hubungan di sebalik yield yield perlu menerima fungsi sebagai parameter . Dan fungsi ini perlu dilaksanakan, jadi hasil biasanya diikuti oleh operasi tak segerak, tetapi fungsi itu, jadi ubah sahaja seperti ini: 🎜 rrreee
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan