Maison > Questions et réponses > le corps du texte
Mon code est comme ça
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)
Mon résultat d'exécution attendu, la console devrait imprimer 1, 2, 3
Mais lors de l'exécution, le programme a signalé une erreur
Je devrais dire que c'est le mienyield
后面应该跟function
但是上面的demo中我的yield
后面跟的已经是function
Pourquoi n'y a-t-il aucun résultat attendu ?
Deuxième façon d'écrire :
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
Accepte déjà une fonction génératrice. La méthode d'écriture ci-dessus ne peut pas afficher 1,2,3 sur la console
漂亮男人2017-05-16 13:37:43
Votreyield
后面跟的不是are
这个函数,而是are
执行后的返回值。
其实它等于yield undefined
, voici la raison de l'erreur.
PHPz2017-05-16 13:37:43
Jetez simplement un œil au code source de la bibliothèque co
. L'erreur est signalée par la bibliothèque co
. La raison est que, comme mentionné ci-dessus, undefined<. /code> est renvoyé. Le code d'erreur spécifique est le suivant :
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
détecte s'il s'agit de Promise
. La bibliothèque co
essaie d'abord de convertir yield
en Promise<. / code>, voir la fonction toPromise
pour plus de détails : 🎜
rrreee
🎜L'entrée est non définie
, donc à la fin toPromise
renvoie undéfini
, et la détection n'est pas Promise
, donc c'est une erreur générée. 🎜
🎜Quant à la raison pour laquelle 1,2,3
n'est pas affiché, c'est à cause de la relation derrière yield
yield
doit accepter des fonctions comme paramètres. . Et cette fonction doit être exécutée, donc yield
est généralement suivi d'une opération asynchrone. Cette fonction est la fonction de rappel, mais cette fonction, alors changez-la comme ceci : 🎜
rrreeerépondre0