Rumah > Soal Jawab > teks badan
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
后面跟的已经是function
Mengapa 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)
})
co
Sudah menerima fungsi penjana Kaedah penulisan di atas tidak boleh mengeluarkan 1,2,3 pada konsol
漂亮男人2017-05-16 13:37:43
Milik andayield
后面跟的不是are
这个函数,而是are
执行后的返回值。
其实它等于yield undefined
, ini adalah sebab kesilapan.
PHPz2017-05-16 13:37:43
Cukup lihat kod sumber pustaka co
Ralat dilaporkan oleh pustaka co
Sebabnya adalah kerana seperti yang dinyatakan di atas, undefined< /code> 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
检测是否为Promise
,co
库先尝试将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: 🎜
rrreeebalas0