嵌套承诺陷入困境

以下代码卡住了:

var Promise = require('promise'); var testPromise = function(){ return new Promise(function(fulfill, reject){ element.all(by.repeater('item in menu.items')).first().then(function(el){ console.log('test f'); fulfill(el); console.log('test fe'); }); }); }; 

…被以下所称:

 testPromise().then(function(el){ console.log('test successful '+el); }); 

控制台打印

 test f test fe 

并没有更多的代码被执行。 它永远不会达到那个尽pipe履行被称为。

如果使用嵌套promise是一个反模式,那么如果没有嵌套promise,我该怎么做:

 var getMenuItemEl = function(itemName){ return new Promise(function(fulfill, reject){ var elFound; element.all(by.repeater('item in menu.items')).then(function(els){ async.each(els, function(el, callback){ el.getText().then(function(text){ console.log('getMenuItemEl:'+text); if(text === itemName){ elFound = el; } callback(); }); }, function(err){ console.log('complete '+elFound); if(elFound){ console.log('fulfill'); fulfill(elFound); console.log('after fulfill'); }else{ reject('no item found'); } }); }); }); }; 

完成调用后,这也会卡住

如果使用嵌套承诺是一个反模式,那么我如何做到以下没有嵌套承诺

你不会使用async库。 由于所有的方法( element.all()el.getText()等)都已经返回了promise,所以你不需要回到节点式的错误callback。 从我的“承诺规则”中 , 每个asynchronous函数(即使是callback函数)都应该返回一个承诺 ,并使用库的方法来编写它们 。 你真的不需要自己调用Promise构造函数。 你在那里做的迭代可以很容易地通过elsmap来完成,然后把所有单个的promise和Promise.all一起收集起来。

 function getMenuItemEl(itemName) { return element.all(by.repeater('item in menu.items')) .then(function(els){ return Promise.all(els.map(function(el) { return el.getText() .then(function(text){ console.log('getMenuItemEl:'+text); return (text === itemName) ? el : null; }); })); }) .then(function(foundEls) { for (var i=0; i<foundEls.length; i++) if (foundEls[i] != null) { console.log('fulfill'); return foundEls[i]; } throw new Error('no item found'); }); } 

下面的代码解决了我的问题,主要是由于我对量angular器api缺乏了解

 var doClickMenuItemEl = function(itemName){ return element.all(by.repeater('item in menu.items')).filter(function(elem, index) { return elem.getText().then(function(text) { return text === itemName; }); }).then(function(els){ els[0].click(); }); }; 

它也说在https://github.com/angular/protractor/issues/379

是的,这是从webdriver承诺inheritance的,不幸的是,这不符合A +标准。