Вы смущены порядком выполнения вашего асинхронного кода.
Как написано,
var assign = Request({
url: assignurl,
выполняет задолго до того, ваша функция выполняет строку обеспечивая ваш assignurl
:
assignurl=urls.URL('http:// ...
Называя Request() constructor, (var assign = Request({
), вы назначили url
так как в то время существовали assignurl
. Изменение переменной assignurl
после этой точки не влияет на assign
Request
. Таким образом, вам нужно либо изменить assign.url
, либо создать запрос после наличия URL-адреса.
ПРИМЕЧАНИЕ: Параметр url
должен присутствовать и быть действительным при вызове Request
конструктора. Таким образом, я предполагаю, что ваш вопрос некорректен в том, что ошибка:
RequirementError: The option "url" is invalid.
происходит только внутри onCompletion
обработчика fetch
. Это должно было произойти, когда вы выполнили var assign = Request({url:asignurl
с недопустимым assignurl
.
Есть несколько способов, которые вы можете изменить свой код, чтобы использовать URL, который теперь у вас есть (от с fetch
onComplete
обратного вызова) в Request, которые вы создаете для assign
. Какой метод вы используете, будет зависеть от того, будете ли вы использовать очень похожий запрос, который вы используете для assign
в нескольких местах вашего кода.
Одним из возможных изменений будет двигаться создание assign
Request
в onCompletion
обработчик для fetch
:
var Request = require("sdk/request").Request;
var assignurl; //Unknown from Question
var technician_id=[]; //Unknown from Question
var workorder_id; //Unknown from Question
var assign;
var fetch = Request({
url: 'http://itildemo.servicedeskplus.com/sdpapi/request?INPUT_DATA={%22operation%22:{%22details%22:{%22status%22:%22open%22,%22from%22:0,%22limit%22:500,%22filterby%22:%22Unassigned_System%22}}}&OPERATION_NAME=GET_REQUESTS&TECHNICIAN_KEY=07109ADB-E642-4F46-917C-CA60F89CE6DC&format=json',
overrideMimeType: "text/plain; charset=latin1",
onComplete: function (response) {
workorder_id=JSON.parse(response.text).operation.details;
if(workorder_id!=null){
assignurl=urls.URL('http://itildemo.servicedeskplus.com/sdpapi/request/'+workorder_id[0].WORKORDERID+'?OPERATION_NAME=EDIT_REQUEST&TECHNICIAN_KEY=07109ADB-E642-4F46-917C-CA60F89CE6DC&INPUT_DATA= <Details><parameter><name>technician</name><value>'+technician_id[0].NAME+'</value></parameter></Details>');
assign = Request({
url: assignurl,
overrideMimeType: "text/plain; charset=latin1",
onComplete: function (response) {
var o=technician_id[0];
for (var k = 0; k < technician_id.length; k++) {
if (technician_id.length - 1 == k) {
technician_id[k] = o;
} else {
technician_id[k] = technician_id[k + 1];
};
};
fetch.get(); //This will throw an error (see below). Even if it
// worked it is recursive, which is probably not
// what you desire.
}
});
console.log(assign.url);
assign.get();}
else{
fetch.get(); //This should always throw an error as you are attempting to
// re-use the Request. In other words, the only way to get
// here is if you have already done fetch.get() once
// and reusing the Request throws an error.
}
}
});
Если вы можете оформить несколько assign
запросов, вы можете структурировать код таким образом, чтобы создавать assign
Request
инкапсулируется в пределах function
, который вы можете вызвать несколько раз, чтобы создать несколько очень похожих запросов, если вам нужно сделать это в другом месте вашего кода:
var Request = require("sdk/request").Request;
var technician_id=[]; //Unknown from Question
var workorder_id; //Unknown from Question
var assign;
var fetch = Request({
url: 'http://itildemo.servicedeskplus.com/sdpapi/request?INPUT_DATA={%22operation%22:{%22details%22:{%22status%22:%22open%22,%22from%22:0,%22limit%22:500,%22filterby%22:%22Unassigned_System%22}}}&OPERATION_NAME=GET_REQUESTS&TECHNICIAN_KEY=07109ADB-E642-4F46-917C-CA60F89CE6DC&format=json',
overrideMimeType: "text/plain; charset=latin1",
onComplete: function (response) {
workorder_id=JSON.parse(response.text).operation.details;
if(workorder_id!=null){
assign = setupAssignRequest(urls.URL('http://itildemo.servicedeskplus.com/sdpapi/request/'+workorder_id[0].WORKORDERID+'?OPERATION_NAME=EDIT_REQUEST&TECHNICIAN_KEY=07109ADB-E642-4F46-917C-CA60F89CE6DC&INPUT_DATA= <Details><parameter><name>technician</name><value>'+technician_id[0].NAME+'</value></parameter></Details>'));
console.log(assign.url);
assign.get();}
else{
fetch.get(); //As stated above, this should always throw an error.
}
}
});
function setupAssignRequest(assignurl) {
return Request({
url: assignurl,
overrideMimeType: "text/plain; charset=latin1",
onComplete: function (response) {
var o=technician_id[0];
for (var k = 0; k < technician_id.length; k++) {
if (technician_id.length - 1 == k) {
technician_id[k] = o;
} else {
technician_id[k] = technician_id[k + 1];
};
};
fetch.get(); //If the only code you have is what is shown, this will
// throw an error. It is possible that "fetch" has been
// re-initialized with a new call to Request elsewhere
// in your code.
}
});
}
Относительно fetch.get();
в вашем fetch
обработчика onComplete
: Попытка сделать это должна всегда приводить к ошибке. Единственный способ добраться до этого кода является уже называется fetch.get();
и each Request
can only be used once:
Each Request object is designed to be used once. Attempts to reuse them will throw an error.
Возможный дубликат [? Как вернуть ответ от асинхронного вызова] (http://stackoverflow.com/questions/ 14220321/how-do-i-return-the-response-from-a-асинхронный вызов) – Makyen
Как написано, 'assignurl = urls.URL (...' выполняется хорошо после 'url: assignurl,'. Таким образом, когда вы 'assign.get();' url - это то, что было до выполнения показанного кода (т. е. недействительно). – Makyen
@Makyen может быть, я задаю глупый вопрос, однако я не понимаю, как Я делаю это? – user2881430