gpt4 book ai didi

javascript - 使用requirejs为chrome扩展创建bluebird promise 时出错

转载 作者:行者123 更新时间:2023-11-28 19:56:04 25 4
gpt4 key购买 nike

我正在开发一个使用“chrome.storage.local”的 chrome 扩展,并尝试从 chrome.storage.local.get() 异步函数中创建一个 promise ,我希望能够抛出异常以及拒绝/解决。我尝试使用下面的实现对此进行测试,但是从控制台日志中看到一个错误,该错误似乎来自“readLocalStorageObj("prefs").then(function(item) {”行(错误显示在代码后面)。

require([
"libs/bluebird"
],
function(Promise) {
function readLocalStorageObj(itemName) {
var localReadResult = Promise.method(function(item) {
console.log("localReadResult():", item);
// if (chrome.runtime.lastError) {
// throw new Error(chrome.runtime.lastError);
// }

if (Object.getOwnPropertyNames(item).length > 0) {
console.log('in if part');
return item;
}
else {
console.log('in else part');
// throw new Error("my test exception");
return undefined;
}
});

chrome.storage.local.get(itemName, localReadResult);
return localReadResult;
};

readLocalStorageObj("prefs").then(function(item) {
console.log('success', item);
}, function(e) {
console.log('fail', e);
}).error(function(e) {
console.log('error', e);
}).catch(ChromeRuntimeError, function(e) {
console.log('catch', e);
}).finally(function(a) {
console.log('finally', a);
});
});

错误:

Uncaught TypeError: Object function Promise$_method() { var value; switch(arguments.length) { case 0: value = tryCatch1(fn, this, void 0); break; case 1: value = tryCatch1(fn, this, arguments[0]); break; case......n'

我似乎不太明白这是什么原因,并且非常感谢任何帮助。

TIA

最佳答案

尝试像这样创建 promise :

require([
"libs/bluebird"
],
function(Promise) {
function readLocalStorageObj(itemName) {
return new Promise(function(resolve, reject) {
chrome.storage.local.get(itemName, function(item) {
if (chrome.runtime.lastError) {
return reject(chrome.runtime.lastError);
}

if (Object.getOwnPropertyNames(item).length > 0) {
return resolve(item);
}
reject(new Error("empty item"));
});
});
}

readLocalStorageObj("prefs").then(function(item) {
console.log('success', item);
}, function(e) {
console.log('fail', e);
}).error(function(e) {
console.log('error', e);
}).catch(ChromeRuntimeError, function(e) {
console.log('catch', e);
}).finally(function(a) {
console.log('finally', a);
});
});
<小时/>

但是,如果您需要大量使用带有扩展回调约定的 Promise,这将导致大量样板文件。

为了避免样板,您可以为此约定定义一个通用的 promise 函数:

function promisfyChrome(fn, ctx) {
return function() {
var args = [].slice.call(arguments);
var self = ctx || this;
return new Promise(function(resolve, reject) {
args.push(function(value) {
if (chrome.runtime.lastError)
return reject(chrome.runtime.lastError);
resolve(value);
});
fn.apply(self, args);
})
};
}

用法:

require([
"libs/bluebird"
],
function(Promise) {
var chromeLocalStorageGet = promisifyChrome(chrome.storage.local.get, chrome.storage.local);
function readLocalStorageObj(itemName) {
return chromeLocalStorageGet(itemName).then(function(item) {
if (Object.getOwnPropertyNames(item).length > 0) {
return item;
}
throw new Error("empty item");
});
}

readLocalStorageObj("prefs").then(function(item) {
console.log('success', item);
}, function(e) {
console.log('fail', e);
}).error(function(e) {
console.log('error', e);
}).catch(ChromeRuntimeError, function(e) {
console.log('catch', e);
}).finally(function(a) {
console.log('finally', a);
});
});
<小时/>

顺便说一句:

    readLocalStorageObj("prefs").then(function(item) {
console.log('success', item);
}, function(e) {
console.log('fail', e);
}).error(function(e) {
console.log('error', e);
}).catch(ChromeRuntimeError, function(e) {
console.log('catch', e);
}).finally(function(a) {
console.log('finally', a);
});

在这种情况下相当于:

    readLocalStorageObj("prefs").then(function(item) {
console.log('success', item);
}).catch(Error, function(e) {
console.log('fail', e);
}).error(function(e) {
console.log('error', e);
}).catch(ChromeRuntimeError, function(e) {
console.log('catch', e);
}).finally(function(a) {
console.log('finally', a);
});

正如您所看到的,第一个 catch 已经捕获了任何类型的错误,因此其他捕获永远不会被触发。您将希望以相反的方式执行此操作 - 首先是更具体的捕获处理程序,最后是更通用的捕获处理程序。

此外,将 .then 与 2 个函数一起使用确实很难阅读,因此不建议这样做。优先选择 .then(fn).catch(fn2) 而不是 .then(fn, fn2)

关于javascript - 使用requirejs为chrome扩展创建bluebird promise 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22537983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com