Javascript 如何让量角器延迟承诺生效? 场景1)陈旧元素引用错误

Javascript 如何让量角器延迟承诺生效? 场景1)陈旧元素引用错误,javascript,promise,protractor,Javascript,Promise,Protractor,我认为上面的代码在所有元素上运行完迭代之后,队列上会有大量承诺。但是当def.then语句运行时,Selenium会告诉我有过时的元素。迭代正在运行该css的元素 我希望得到一系列关于迭代所要求的一切的解决承诺 场景2)提供了过时的元素引用 var-promises=Array(); var等位基因:webdriver.IWebElement[]=[]; 它(“应具有所有元素”,功能(完成){ var-alllinks:webdriver.WebElement[]; browser.contro

我认为上面的代码在所有元素上运行完迭代之后,队列上会有大量承诺。但是当def.then语句运行时,Selenium会告诉我有过时的元素。迭代正在运行该css的元素

我希望得到一系列关于迭代所要求的一切的解决承诺

场景2)提供了过时的元素引用
var-promises=Array();
var等位基因:webdriver.IWebElement[]=[];
它(“应具有所有元素”,功能(完成){
var-alllinks:webdriver.WebElement[];
browser.controlFlow().execute(()=>{
browser.findElements(按.tagName(“a”))。然后((工作)=>{
所有链接=工作;
alllinks.forEach((ele)=>{
promises.push(ele.getAttribute(“href”);
promises.push(ele.getId());
promises.push(ele.getInnerHtml());
promises.push(ele.getLocation());
});
//正在获取过时的引用。。。
量角器。承诺。所有(承诺)。然后((wtf)=>{
调试器;
});
调试器;
});
});

请告知。

我的小例子可能会对您有所帮助:

viewBookingDetailsPage.roomtypeAttributeForParticularDay = function (day, roomTypeNumber, selector) {
    var deferred = protractor.promise.defer();
    element.all(by.repeater(viewBookingDetailsPage.guestroomInfo.allDays)).then(function (days) {
        days[day].all(by.repeater(viewBookingDetailsPage.guestroomInfo.roomTypesInDay)).then(function (roomTypes) {
            deferred.fulfill(roomTypes[roomTypeNumber].$(selector));
        });
    });
    return deferred.promise;
};
承诺成功解决后,您需要使用“履行”返回结果。

我认为您需要:


现在,
链接
将包含一个解析为对象数组的承诺。

这个承诺数组是在哪里创建和解析的?我必须将所有承诺存储在一个数组中吗?每个get xx都是上面代码中的承诺。我想知道为什么会运行回调,您似乎不会在任何地方解析延迟的承诺。
var promises = Array<webdriver.promise.Promise<any>>();
var allElements: webdriver.IWebElement[] = [];
it("should have all elements", function (done) {
    var alllinks: webdriver.WebElement[];
    browser.controlFlow().execute(() => {
        browser.findElements(by.tagName("a")).then((works) => {
            alllinks = works;
            alllinks.forEach((ele) => {
                promises.push(ele.getAttribute("href"));
                promises.push(ele.getId());
                promises.push(ele.getInnerHtml());
                promises.push(ele.getLocation());
            });
            //getting stale reference here...
            protractor.promise.all(promises).then((wtf) => {
                debugger;
            });

            debugger;
        });
    });
viewBookingDetailsPage.roomtypeAttributeForParticularDay = function (day, roomTypeNumber, selector) {
    var deferred = protractor.promise.defer();
    element.all(by.repeater(viewBookingDetailsPage.guestroomInfo.allDays)).then(function (days) {
        days[day].all(by.repeater(viewBookingDetailsPage.guestroomInfo.roomTypesInDay)).then(function (roomTypes) {
            deferred.fulfill(roomTypes[roomTypeNumber].$(selector));
        });
    });
    return deferred.promise;
};
var links = element.all(by.tagName("a")).map(function (link) {
    return {
        href: link.getAttribute("href"),
        id: link.getId(),
        innerHTML: link.getInnerHtml(),
        location: link.getLocation()
    }
});