2016-10-20 24 views
2

我有以下方法:更改方法使用Promise.all在打字稿

public static zoomInMap(times: number): void { 

    for (let i = 0; i < times; i++) { 
    let zoomInButton = element(by.css('#main > cc-map > div.google-map-base- container-inner > div > div.gmnoprint.gm-bundled-control.gm-bundled-control-on-bottom > div:nth-child(1) > div > div:nth-child(1)')); 
    zoomInButton.click(); 
    browser.sleep(Config.ZOOM_ANIMATION_TIMEOUT).then(() => { 
    // console.log('Map Zoomed In'); 
    }); 
} 

}

我想讓它返回一個承諾。我想用Promise.all 像:

public static zoomInMap(times: number): Promise<any> { 

return Promise.all(?) // ? I do not know how to do it 
    for (let i = 0; i < times; i++) { 
    let zoomInButton = element(by.css('#main > cc-map > div.google-map-base-container-inner > div > div.gmnoprint.gm-bundled-control.gm-bundled-control-on-bottom > div:nth-child(1) > div > div:nth-child(1)')); 
    zoomInButton.click(); 
    browser.sleep(Config.ZOOM_ANIMATION_TIMEOUT).then(() => { 
    // console.log('Map Zoomed In'); 
    }); 
    } 
} 

我應該如何返工的代碼中使用Promise.all。對不起,跛腳的問題。

回答

2

收集了你的承諾在數組中,然後調用數組Promise.all並返回結果,這是聚集承諾:

public static zoomInMap(times: number): Promise { 
    let promises = []; 
    for (let i = 0; i < times; i++) { 
    let zoomInButton = element(by.css('#main > cc-map > div.google-map-base- container-inner > div > div.gmnoprint.gm-bundled-control.gm-bundled-control-on-bottom > div:nth-child(1) > div > div:nth-child(1)')); 
    zoomInButton.click(); 
    promises.push(browser.sleep(Config.ZOOM_ANIMATION_TIMEOUT).then(() => { 
     // You can do something here if you like, or remove the `then` 
    })); 
    } 
    return Promise.all(promises); 
} 

我不是打字稿大,你可能需要調整數組的聲明。我已將函數的返回類型從void更改爲Promise

1

您可以創建尺寸爲timesArray而不是使用循環。然後用map填寫:

public static zoomInMap(times: number): Promise<void> { 
    return Promise.all(new Array(times).fill().map(() => { 

    let zoomInButton = element(by.css('#main > cc-map > div.google-map-base-container-inner > div > div.gmnoprint.gm-bundled-control.gm-bundled-control-on-bottom > div:nth-child(1) > div > div:nth-child(1)')); 
    zoomInButton.click(); 

    return browser.sleep(Config.ZOOM_ANIMATION_TIMEOUT).then(() => { 
    // console.log('Map Zoomed In'); 
    }); 

    })); 
}