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
Votre
yield
后面跟的不是are
这个函数,而是are
执行后的返回值。其实它等于
yield undefined
, voici la raison de l'erreur.Les fonctions normales ne sont pas prises en charge
Jetez simplement un œil au code source de la bibliothèque
co
. L'erreur est signalée par la bibliothèqueco
. La raison est que, comme mentionné ci-dessus,undefined<.> est renvoyé. Le code d'erreur spécifique est le suivant :
co
库的源码就好,报错是co
库报出来的,原因是因为楼上说的返回了undefined
,具体报错代码如下:isPromise
检测是否为Promise
,co
库先尝试将yield
后转换为Promise
,具体参见toPromise
函数:传入的是
undefined
,所以最终toPromise
返回了undefined
,检测不是Promise
,所以就抛出了错误。至于为什么没有输出
1,2,3
的原因,是因为yield
后面的关系,yield
后面是要接受函数作为参数,并且要执行这个函数的,所以yield
isPromise
détecte s'il s'agit dePromise
. La bibliothèqueco
essaie d'abord de convertiryield
enPromise<. code>, voir la fonction
toPromise
pour plus de détails : 🎜 rrreee 🎜L'entrée estnon définie
, donc à la fintoPromise
renvoieundéfini
, et la détection n'est pasPromise
, donc c'est une erreur générée. 🎜 🎜Quant à la raison pour laquelle1,2,3
n'est pas affiché, c'est à cause de la relation derrièreyield
yield
doit accepter des fonctions comme paramètres. . Et cette fonction doit être exécutée, doncyield
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 : 🎜 rrreee