node.js - Le module co de nodejs s'auto-exécute
伊谢尔伦
伊谢尔伦 2017-05-16 13:35:43
0
4
713

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后面跟的已经是functionPourquoi 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)
    })

coAccepte déjà une fonction génératrice. La méthode d'écriture ci-dessus ne peut pas afficher 1,2,3 sur la console

伊谢尔伦
伊谢尔伦

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

répondre à tous(4)
漂亮男人

Votreyield后面跟的不是are这个函数,而是are执行后的返回值。
其实它等于yield undefined, voici la raison de l'erreur.

某草草
function* are(){

}
伊谢尔伦

Les fonctions normales ne sont pas prises en charge

PHPzhong

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<.> 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检测是否为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 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 : 🎜 rrreee
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal