2016-03-23 3 views
0

Ich habe das folgende Codebeispiel in einem Skript implementiert, das eine Reihe von Ergebnissen durchläuft und für jede eine HTTP-Anforderung erstellt.Wie kann ich eine Versprechensfolge beenden, wenn das Array verarbeitet wurde?

Das Skript wird nicht beendet, nachdem alle Elemente im Array verarbeitet wurden. Wie würde ich es anpassen, damit dies geschieht?

Meine Implementierung macht einen API-Aufruf und gibt ein Versprechen:

.... 

}).then(function(results){ 
sequence(results, function(result){ 

    checkSpam(result).then(function(akismet){ 
     if(akismet) { 
      //console.log('spam returned from checkspam'); 
      write_spam_to_file(result); 
     } else { 

      //console.log('no spam returned from checkspam'); 
     } 
    }) 
}); 

}).catch(function (e) { 
    console.log('Error occurred:'); 
    console.log(e); 
}); 


function sequence(array, callback) { 
    return array.reduce(function chain(promise, item) { 
     return promise.then(function() { 
      return callback(item); 
     }); 
    }, Promise.resolve()); 
} 

function checkSpam(entry) { 

    var akismetPromise = new Promise(function resolver(resolve, reject) { 
     akismet.checkSpam({ 
      user_agent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1', 
      referrer: 'http://google.com', 
      user_ip: entry.ip, 
      comment_author: entry.poster, 
      comment_content: entry.message, 
      comment_type: 'forum-post' 


     }, function (err, spam) { 
      if (err) reject(err); 
      resolve(spam); 
     }); 

    }); 
    return akismetPromise; 

} 
+0

Was genau meinen Sie mit "nicht verlassen"? Sie meinen, Knoten hört nicht auf zu laufen? Das liegt kaum an den Versprechen, eher an "Akismet" oder was auch immer du benutzt. – Bergi

+0

@Bergi Ich bin neu zu versprechen, also war ich mir nicht sicher, ob ich etwas falsch gemacht hatte. Ich habe etwas mehr Code für den Fall hinzugefügt, dass es kein Licht mehr gibt. Danke für einen Blick. – codecowboy

+0

Beim Durchlaufen von Arrays können Sie innerhalb der Schleifenmethode false zurückgeben, um die Iteration zu stoppen. – Silkster

Antwort

3

Im Gegensatz zu Ihrem ersten Schnipsel, Ihr eigentlicher Code fehlt ein Bündel von return Schlüsselwort:

… 
}).then(function(results) { 
    return sequence(results, function(result) { 
// ^^^^^^ 
     return checkSpam(result).then(function(akismet) { 
//  ^^^^^^ 
      if (akismet) { 
       return write_spam_to_file(result); 
//    ^^^^^^ // assuming the write is asynchronous and returns a promise? 
      } 
     }); 
    }); 
}) … 

Wenn Sie don‘ t always return a promise von asynchronen Funktionen (einschließlich then Rückrufe), die Versprechenskette weiß nicht, worauf zu warten ist, und führt den nächsten Rückruf aus, ohne auf irgendwelche Ergebnisse zu warten.

+1

Wir brauchen ein kanonisches über vergessene Antworten, die diese Fragen eine Menge Male zurückgeben. "Promise nicht auf Action warten" oder so, das Problem ist, dass klingt ein wenig zu generisch ... –

+0

@BenjaminGruenbaum: Ja, aber das nächste Canonical, das ich schreiben werde, ist über asynchrone Schleifen :-) (es sei denn wir haben schon einen guten?) – Bergi