2017-03-17 19 views
0

以前有沒有人遇到過這個錯誤,並可能爲我提供一些啓示?我被困了好幾天:(Ionic 2 - Promise函數(必須是instanceof Promise錯誤)

Promise Error

我想打電話給使用無極功能我的Web API函數在我的打字稿文件。基本上我試圖通過密鑰列表(int或字符串)我的網絡API和我遇到的錯誤有沒有人知道如何解決 這個問題(必須的instanceof無極錯誤)

控制器:?

import { Injectable } from 'angular2/core'; 
import { Http, Headers, RequestOptions } from '@angular/http'; 
import 'rxjs/add/operator/toPromise'; 
import 'rxjs/add/operator/map'; 

export class WorkOrderService { 
    private tasks: any; 
    private taskItems: any; 
    private woSummary: any; 


    static get parameters() { 
     return [[Http]]; 
    } 

    public constructor(private http: Http) { 
    } 

public DownloadWO(ClientApiUrl, workOrders) { 

    var headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 

    var workOrderKeys = new Array(); 

    for (let workOrder of workOrders) { 
     if (workOrder.checked) { 
      workOrderKeys.push(workOrder.WorkOrderKey); 
     } 
    } 

    //ERROR CANT SOLVE 
    return new Promise((resolve, reject) => { 
     this.http.post(ClientApiUrl + "workorder/UpdateAndLockWorkOrders", workOrders, { headers: headers }) 
      .map(res => res.json()) 
      .subscribe(
      data => { 
       resolve(data); 
      }, 
      err => { 
       reject(err); 
      }); 
    }); 
} 

} 

幕後碼.TS

import { Component } from '@angular/core'; 
import { AlertController, ModalController, NavController, LoadingController } from 'ionic-angular'; 

import { Global } from '../../app/global'; 

import { LocationService } from '../../services/locationService'; 
import { DepartmentService } from '../../services/departmentService'; 
import { WorkOrderService } from '../../services/workOrderService'; 

import { HomePage } from '../home/home'; 
import { ModalPmTaskPage } from './modal-pmTask' 

@Component({ 
    selector: 'page-downloadWO', 
    templateUrl: 'downloadWO.html' 
}) 

export class DownloadWOPage { 
    private sites: any; 
    private selectPLocID: string; 
    private selectedSite: number; 
    private parentLocations: any; 
    private selectedPLocation: number; 
    private locations: any; 
    private selectedLocation: number; 
    private departments: any; 
    private selectedDepartment: number; 
    private fromDate: Date; 
    private toDate: Date; 
    private workOrders: any; 
    private isLock: number; 
    private pmTaskItems: any; 

    public constructor(
     private navCtrl: NavController, 
     private workOrderService: WorkOrderService, 
     private locationService: LocationService, 
     private departmentService: DepartmentService, 
     private global: Global, 
     private alertCtrl: AlertController, 
     private modalCtrl: ModalController, 
     private loadingCtrl: LoadingController) { 
    } 

public download() { 
     let loader = this.loadingCtrl.create({ 
      content: "Please wait..." 
     }); 

     //Download & Lock WorkOrders 
     this.workOrderService.DownloadWO(this.global.getClientApiUrl(), this.workOrders).then(data => { 
      loader.dismiss(); 
      let alert = this.alertCtrl.create({ 
       title: 'Success', 
       subTitle: 'Work Orders has downloaded sucessfully', 
       buttons: [{ 
        text: 'OK', 
        handler:() => { 
         this.navCtrl.push(HomePage); 
        } 
       }] 
      }); 
      alert.present(); 
     }).catch(function (err) { 
      loader.dismiss(); 
      let alert = this.alertCtrl.create({ 
       title: 'Error', 
       subTitle: err, 
       buttons: [{ 
        text: 'OK' 
       }] 
      }); 
      alert.present(); 
     }); 
    } 
} 

HTML:

<ion-content> 
... 
    <ion-item-divider color="primary">Select Work Order</ion-item-divider> 
    <ion-scroll scrollY="true" style="height:50vh;"> 
     <ion-list> 
      <ion-item text-wrap *ngFor="let workOrder of workOrders;"> 
       <ion-checkbox [(ngModel)]="workOrder.checked" >{{workOrder.checked}}</ion-checkbox> 
       <ion-label> 
        <h2> 
         <b>Work Order ID:</b> {{workOrder.WorkOrderID}} 
        </h2> 
        <h2> 
         <b>PM Task ID:</b> {{workOrder.TaskId}} 
        </h2> 
        <h2> 
         <b>Asset ID:</b> {{workOrder.AssetID}} 
        </h2> 
        <button ion-button color="secondary" (click)="viewTaskItemFromServer(workOrder.WorkOrderKey)">View PM Task Items</button> 
       </ion-label> 
      </ion-item> 
     </ion-list> 
    </ion-scroll> 
    <button ion-button block (click)="download()">Download</button> 
</ion-content> 

C#的Web API:

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data; 
using System.Data.SqlClient; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using MaxPro_WebService.Interface.Controllers; 
using MaxPro_WebService.Interface.Models; 
using System.Net.Http.Headers; 
using System.Web.Script.Serialization; 
using CMMS.AssetsMaintMgmt_BLLAx; 
using System.Transactions; 
using System.IO; 
using System.Threading.Tasks; 
using Newtonsoft.Json.Linq; 

namespace MaxPro_Client_WebService.Controllers 
{ 
    [RoutePrefix("api/WorkOrder")] 
    public class WorkOrderController : ApiController, IWorkOrderController 
    { 
     [Route("UpdateAndLockWorkOrders")] 
     [HttpPost] 
     public async Task<HttpResponseMessage> UpdateAndLockWorkOrders([FromBody]List<string> workOrderKeys) 
     { 
      string errorMsg, exMsg; 
      errorMsg = exMsg = string.Empty; 
      DateTime dtNow = DateTime.Now; 

      errorMsg = exMsg = string.Empty; 

      try 
      { 

       using (var client = new HttpClient()) 
       { 
        ////IL: TRY TO PASS IN CLASS 
        //client.BaseAddress = new Uri("http://localhost/MaxPro_WebService/"); 
        //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
        //var response = await client.PostAsJsonAsync("api/WorkOrder/uploadWorkOrders", workOrders); 
        IEnumerable<WorkOrder> workorders = null; 
        client.BaseAddress = new Uri(ConfigurationManager.AppSettings["ServerBaseURLAddress"]); //Question how to get URL of web service 
        client.DefaultRequestHeaders.Accept.Clear(); 
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

        var response = await client.PostAsJsonAsync("api/WorkOrder/GetWorkOrders", workOrderKeys); 

        if (response.IsSuccessStatusCode) 
        { 
         string responseString = response.Content.ReadAsStringAsync().Result; 
         //JSON Object TO Work Order class 
         workorders = response.Content.ReadAsAsync<IEnumerable<WorkOrder>>().Result; 
         if (InsertRecords(workorders, out errorMsg)) 
         { 
          //IL: 3/2/2017 working for LockWorkOrder 
          //client.BaseAddress = new Uri(ConfigurationManager.AppSettings["ServerBaseURLAddress"]); //Question how to get URL of web service 
          client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
          response = await client.PostAsJsonAsync("api/WorkOrder/LockWorkOrders", workOrderKeys); 

          if (response.IsSuccessStatusCode) 
          { 
           //LOCKING SUCCESSFUL 
           return Request.CreateResponse(HttpStatusCode.OK); 
          } 
          else 
          { 
           //LOCKING UNSUCCESSFUL 
           return Request.CreateErrorResponse((HttpStatusCode)422, new HttpError(exMsg)); 
           //Something has gone wrong, handle it here 
          } 
         } 
         else 
         { 
          //SAVE WO UNSUCCESSFUL 
          return Request.CreateErrorResponse((HttpStatusCode)422, new HttpError(exMsg)); 
          //Something has gone wrong, handle it here 
         } 
        } 
        else 
        { 
         //Something has gone wrong, handle it here 
         return Request.CreateErrorResponse((HttpStatusCode)422, new HttpError(exMsg)); 
        } 
       } 
      } 
      catch (TransactionAbortedException ex) 
      { 
       exMsg = ex.Message; 
       return Request.CreateErrorResponse((HttpStatusCode)422, new HttpError(exMsg)); 
      } 
      catch (ApplicationException ex) 
      { 
       exMsg = ex.Message; 
       return Request.CreateErrorResponse((HttpStatusCode)422, new HttpError(exMsg)); 
      } 
      catch (Exception ex) 
      { 
       exMsg = ex.Message; 
       return Request.CreateErrorResponse((HttpStatusCode)422, new HttpError(exMsg)); 
      } 
     } 
    } 
} 

Enviroments:

IDE:VS2015 科爾多瓦CLI:6.5.0

離子CLI版本:2.2.1

離子應用程序庫版本:2.2.0

操作系統:Windows 7

節點版本:V7 .6.0

的Xcode版本:不安裝後承諾

+0

那到底是什麼問題? –

+0

在調試過程中,promise函數給了我一個錯誤(必須是instanceof Promise錯誤)。所以我試圖谷歌搜索很多解決方案,但無法解決問題。 –

回答

0

http模塊角2的返回Observable,而不是一個承諾。
您可以使用Observable.toPromise()在承諾鏈中將其轉換爲承諾。 嘗試:

return new Promise((resolve, reject) => { 
     this.http.post(ClientApiUrl + "workorder/UpdateAndLockWorkOrders", workOrders, { headers: headers }) 
      .map(res => res.json()).toPromise()//convert to promise 
      .then(//call then instead of subscribe to form the promise chain. 
      data => { 
       resolve(data); 
      }, 
      err => { 
       reject(err); 
      }); 
    }); 

另一種方式是沒有用新的承諾封裝簡化:

return this.http.post(ClientApiUrl + "workorder/UpdateAndLockWorkOrders", workOrders, { headers: headers }) 
       .map(res => res.json()).toPromise()//convert to promise 

你到底抓將從鏈得到錯誤。

+0

真棒我最近也注意到,我仍然試圖解決我的問題,謝謝你suraj –

+0

你仍然收到錯誤? –

+0

不,但新的錯誤正在顯現。 (405方法不允許)。當我搜索時,它顯示我需要設置CORS。 –

0

嘗試指定類型,像這樣:

回報新承諾<任何>((解決,拒絕).....

+0

謝謝,也許我會稍後再嘗試,現在我想現在我得到了一些服務器端問題,所以我需要先解決。 –

相關問題