2017-10-20 146 views
0

我有這樣的代碼:服務工作者promise.then沒有定義

self.addEventListener('fetch', function(event) { 
const promiseChain = doSomethingAsync() 
     .then(() => doSomethingAsyncThatReturnsAURL(event)) 
     .then(someUrl => fetch(someUrl)); 
event.respondWith(promiseChain); 
}); 

它不斷給我這個錯誤:

Uncaught TypeError: Cannot read property 'then' of undefined

它撿起來,在這條線:

.then(() => doSomethingAsyncThatReturnsAURL(event))

僅供參考:

這裏是功能doSomethingAsyncThatReturnsAURL:

function doSomethingAsyncThatReturnsAURL(event) { 
    var location = self.location; 

    console.log("loc", location) 

    self.clients.matchAll({includeUncontrolled: true}).then(clients => { 
    for (const client of clients) { 
     const clientUrl = new URL(client.url); 
     console.log("SO", clientUrl); 
     if(clientUrl.searchParams.get("url") != undefined && clientUrl.searchParams.get("url") != '') { 
     location = client.url; 
     } 
    } 

    console.log("loc2", location) 

    var url = new URL(location).searchParams.get('url').toString(); 

    console.log(event.request.hostname); 
    var toRequest = event.request.url; 
    console.log("Req:", toRequest); 

    var parser2 = new URL(location); 
    var parser3 = new URL(url); 

    var parser = new URL(toRequest); 

    console.log("if",parser.host,parser2.host,parser.host === parser2.host); 
    if(parser.host === parser2.host) { 
    toRequest = toRequest.replace('https://booligoosh.github.io',parser3.protocol + '//' + parser3.host); 
    console.log("ifdone",toRequest); 
    } 

    console.log("toRequest:",toRequest); 

    var finalResult = 'https://cors-anywhere.herokuapp.com/' + toRequest; 

    return finalResult; 

    }); 
} 

而且doSomethingAsync功能:

function doSomethingAsync() { 
     console.log("ASYNC LOL"); 
} 

回答

1

無法讀取屬性‘然後’未定義」告訴你doSomethingAsync()通話不then屬性返回一個對象。我會說doSomethingAsync必須返回Promise。 Promise對象的原型(MDN)上有then方法,因此您可以調用它。試試這個

function doSomethingAsync() { 
    return new Promise(resolve => { 
    console.log("ASYNC LOL"); 
    resolve(); 
    }) 
} 

或只是

function doSomethingAsync() { 
    console.log("ASYNC LOL"); 
    return Promise.resolve(); 
}