recherche

Maison  >  Questions et réponses  >  le corps du texte

node.js - Le module co de nodejs s'auto-exécute

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

伊谢尔伦伊谢尔伦2755 Il y a quelques jours688

répondre à tous(4)je répondrai

  • 漂亮男人

    漂亮男人2017-05-16 13:37:43

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

    répondre
    0
  • 某草草

    某草草2017-05-16 13:37:43

    function* are(){
    
    }
    

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:37:43

    Les fonctions normales ne sont pas prises en charge

    répondre
    0
  • PHPz

    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检测是否为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

    répondre
    0
  • Annulerrépondre